package com.elink.common.wordCompare;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import org.apache.commons.lang3.StringUtils;
import com.elink.common.utils.WordCompareUtils;
import avro.shaded.com.google.common.collect.Lists;
import difflib.Delta;
import difflib.DiffRow;
import difflib.DiffRow.Tag;
import difflib.DiffRowGenerator;
import difflib.DiffUtils;
import difflib.Patch;
/**
* 比较页面的不同
* @author songqiang
*
*/
public class DiffUtil {
private StringBuffer delBuffer = new StringBuffer();//删除字符串
private StringBuffer addBuffer = new StringBuffer();
private StringBuffer updateBuffer = new StringBuffer();
private float changePercent = 1.0f;//修改百分比
private List<String> delArr = Lists.newArrayList();
private List<String> addArr = Lists.newArrayList();
private List<String> updateArr = Lists.newArrayList();
private int allCount=0;//比较总行数
public DiffUtil() {
}
public float getChangePercent() {
changePercent = (addArr.size() + updateArr.size() + delArr.size()) * 1.0f/allCount * 100;
return changePercent;
}
public String getAddStr() {
if(addBuffer.length()==0) {
for(String add:addArr) {
addBuffer.append(add);
}
}
return addBuffer.toString();
}
public String getDelStr() {
if(delBuffer.length()==0) {
for(String add:delArr) {
delBuffer.append(add);
}
}
return delBuffer.toString();
}
public String getUpdateStr() {
if(updateBuffer.length()==0) {
for(String add:updateArr) {
updateBuffer.append(add);
}
}
return updateBuffer.toString();
}
public void compare(String[] oldArr,String[] newArr){
List<String> oldList = Arrays.asList(oldArr);
List<String> newList = Arrays.asList(newArr);
compare(oldList, newList);
}
private boolean print = false;
private void print(String str,boolean line) {
if(print) {
if(line) {
System.out.println(str);
}else {
System.out.print(str);
}
}
}
public void compare(List<String> oldArr,List<String> newArr){
Patch<String> patch = DiffUtils.diff(oldArr, newArr);
// for (Delta<String> delta : patch.getDeltas()) {
// List<?> list = delta.getRevised().getLines();
// for (Object object : list) {
// System.out.println(object);
// }
// }
allCount = newArr.size();
DiffRowGenerator.Builder builder = new DiffRowGenerator.Builder();
builder.showInlineDiffs(false);
DiffRowGenerator generator = builder.build();
for (Delta<String> delta : patch.getDeltas()) {
List<DiffRow> generateDiffRows = generator.generateDiffRows((List<String>) delta.getOriginal().getLines(), (List<String>) delta
.getRevised().getLines());
int oldPos = delta.getOriginal().getPosition();
int newPos = delta.getRevised().getPosition();
Tag afterTag = Tag.EQUAL;
StringBuffer tempAdd = new StringBuffer();
StringBuffer tempDel = new StringBuffer();
StringBuffer tempUpdate = new StringBuffer();
StringBuffer tempoldUpdate = new StringBuffer();
for (DiffRow row : generateDiffRows) {
Tag tag = row.getTag();
if (tag == Tag.INSERT) {
if(afterTag != tag) {
print(newPos+"新增: ", true);
}
if(StringUtils.isNotBlank(row.getNewLine())) {
print(row.getNewLine(), false);
tempAdd.append(row.getNewLine());
}
} else if (tag == Tag.CHANGE) {
//这是比较bug:有时候会出现<br>
String oldLine = row.getOldLine().trim().replace("<br>", "");
String newLine = row.getNewLine().trim().replace("<br>", "");
if(!oldLine.equals(newLine)) {
if(afterTag != tag) {
print(oldPos+"修改: ", true);
}
if(StringUtils.isNotBlank(row.getOldLine())) {
print(oldLine, false);
tempoldUpdate.append(oldLine);
}
if(afterTag != tag) {
print("", true);
}
if(StringUtils.isNotBlank(row.getNewLine())) {
print(newLine, false);
tempUpdate.append(newLine);
}
}
if(afterTag != tag) {
print("", true);
}
} else if (tag == Tag.DELETE) {
if(afterTag != tag) {
print(oldPos+"删除: ", true);
}
if(StringUtils.isNotBlank(row.getOldLine())) {
print(row.getOldLine(), false);
tempDel.append(row.getOldLine());
}
} else if (tag == Tag.EQUAL) {
} else {
throw new IllegalStateException("Unknown pattern tag: " + tag);
}
afterTag = tag;
}
if(StringUtils.isNotBlank(tempDel)) {
String delstr = tempDel.toString().replace("<", "<").replace(">", ">");
delArr.add(delstr);
tempDel.setLength(0);//清空
}
if(StringUtils.isNotBlank(tempAdd)) {
String addstr = tempAdd.toString().replace("<", "<").replace(">", ">");
addArr.add(addstr);
tempAdd.setLength(0);//清空
}
if(StringUtils.isNotBlank(tempUpdate)) {
String oldstr = tempoldUpdate.toString().replace("<", "<").replace(">", ">");
String newstr = tempUpdate.toString().replace("<", "<").replace(">", ">");
updateArr.add(newstr);
tempUpdate.setLength(0);//清空
tempoldUpdate.setLength(0);
}
}
}
}
里面用到一个比对jar包diffutils-1.3.0.jar 去我的下载哪儿拿,要1个积分也可以自己搜