java 比對文本

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("&lt;", "<").replace("&gt;", ">");
                delArr.add(delstr);
                tempDel.setLength(0);//清空
            }
            if(StringUtils.isNotBlank(tempAdd)) {
                String addstr = tempAdd.toString().replace("&lt;", "<").replace("&gt;", ">");
                addArr.add(addstr);
                tempAdd.setLength(0);//清空
            }
            if(StringUtils.isNotBlank(tempUpdate)) {
                String oldstr = tempoldUpdate.toString().replace("&lt;", "<").replace("&gt;", ">");
                String newstr = tempUpdate.toString().replace("&lt;", "<").replace("&gt;", ">");
                
                    updateArr.add(newstr);
                    tempUpdate.setLength(0);//清空
                    tempoldUpdate.setLength(0);
                
            }
        }
    }
}
裏面用到一個比對jar包diffutils-1.3.0.jar 去我的下載哪兒拿,要1個積分也可以自己搜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章