package com.example.demo;
/**
* 傳入2個字符串進行相比高亮顯示
* 例如
* 原數據一:王五張三
* 原數據二:張三李四
* <span style='color:blue'>王五</span>張三
* 張三<span style='color:blue'>李四</span>
*/
public class StringHighLightDifferentUtil {
public static String[] getHighLightDifferent(String a,String b){
String[] temp=getDiff(a, b);
String[] result={getHighLight(a, temp[0]),getHighLight(b, temp[1])};
return result;
}
private static String getHighLight(String source,String temp){
StringBuffer sb=new StringBuffer();
char[] sourceChars=source.toCharArray();
char[] tempChars=temp.toCharArray();
boolean flag=false;
for(int i=0;i<sourceChars.length;i++){
if(tempChars[i]!=' '){
if(i==0) sb.append("<span style='color:blue'>").append(sourceChars[i]);
else if(flag) sb.append(sourceChars[i]);
else sb.append("<span style='color:blue'>").append(sourceChars[i]);
flag=true;
if(i==sourceChars.length-1) sb.append("</span>");
}
else if(flag==true){
sb.append("</span>").append(sourceChars[i]);
flag=false;
}else sb.append(sourceChars[i]);
}
return sb.toString();
}
public static String[] getDiff(String a, String b) {
String[] result = null;
//選取長度較小的字符串用來窮舉子串
if (a.length() < b.length()) {
result = getDiff(a, b, 0, a.length());
} else {
result = getDiff(b, a, 0, b.length());
result = new String[]{result[1],result[0]};
}
return result;
}
//將a的指定部分與b進行比較生成比對結果
private static String[] getDiff(String a, String b, int start, int end){
String[] result = new String[]{a, b};
int len = result[0].length();
while (len > 0) {
for (int i = start; i < end - len + 1; i++) {
String sub = result[0].substring(i, i + len);
int idx = -1;
if ((idx = result[1].indexOf(sub)) != -1) {
result[0] = setEmpty(result[0], i, i + len);
result[1] = setEmpty(result[1], idx, idx + len);
if (i > 0) {
//遞歸獲取空白區域左邊差異
result = getDiff(result[0], result[1], 0, i);
}
if (i + len < end) {
//遞歸獲取空白區域右邊差異
result = getDiff(result[0], result[1], i + len, end);
}
len=0;//退出while循環
break;
}
}
len = len / 2;
}
return result;
}
//將字符串s指定的區域設置成空格
public static String setEmpty(String s, int start, int end) {
char[] array = s.toCharArray();
for (int i = start; i < end; i++) {
array[i] = ' ';
}
return new String(array);
}
}
運行結果: