找两个字符串之间所有不同的位置和不同的内容,文本差异对比

package com.sockerTest.netty;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class Diff0 {
    public static void main(String[] args) {
        String source="12456";
        String target="12356";
        List<Yx> diff0 = new Diff0().diff0(source, target);
        List<Yx> diff = new Diff0().diff(source, target);
        int sourceDiffLength=0;
        int targetDiffLength=0;
            StringBuffer sourceBuffer = new StringBuffer(source);
            StringBuffer targetBuffer = new StringBuffer(target);
            if (diff0.size()<=diff.size()){
                for (Yx yx:diff0){
                    if (yx.type.equals("source")){
                        sourceBuffer.insert(yx.index+2*sourceDiffLength,"【");
                        sourceBuffer.insert(yx.index+yx.length+1+2*sourceDiffLength,"】");
                        sourceDiffLength++;
                    }
                    if (yx.type.equals("target")){
                        targetBuffer.insert(yx.index+2*targetDiffLength,"【");
                        targetBuffer.insert(yx.index+yx.length+1+2*targetDiffLength,"】");
                        targetDiffLength++;
                    }
                }
                System.out.println(sourceBuffer.toString());
                System.out.println(targetBuffer.toString());
            }else {
                for (Yx yx:diff){
                    if (yx.type.equals("source")){
                        sourceBuffer.insert(yx.index+2*sourceDiffLength,"【");
                        sourceBuffer.insert(yx.index+yx.length+1+2*sourceDiffLength,"】");
                        sourceDiffLength++;
                    }
                    if (yx.type.equals("target")){
                        targetBuffer.insert(yx.index+2*targetDiffLength,"【");
                        targetBuffer.insert(yx.index+yx.length+1+2*targetDiffLength,"】");
                        targetDiffLength++;
                    }
                }
                System.out.println(sourceBuffer.toString());
                System.out.println(targetBuffer.toString());
            }

    }

    public List<Yx> diff(String source , String target){
        ArrayList<Yx> yxes = new ArrayList<>();
        char[] sourceChar = source.toCharArray();
        char[] targetChar = target.toCharArray();
        char souDiff='0';
        char tarDiff='0';
        int i=0,j=0;
        while (true){
            if (i==source.length()&&j<target.length()){
                Yx target1 = new Yx("target", j, target.length() - j);
                yxes.add(target1);
                break;
            }
            if (j==target.length()&&i<source.length()){
                Yx target1 = new Yx("source", i, source.length() - i);
                yxes.add(target1);
                break;
            }
            if (i==source.length()&&j==target.length()){
                break;
            }
            if (!(targetChar[j]==sourceChar[i])){
                ArrayList<Character> tarcharacters = new ArrayList<>();
                ArrayList<Character> soucharacters = new ArrayList<>();
                souDiff=sourceChar[i];
                tarDiff=targetChar[j];
                int tempi=i,tempj=j;
                while (true){
                    if (j>=target.length()&&i>=source.length()){
                        break;
                    }
                    if (j<target.length()){
                        if (targetChar[j]==souDiff){
                            soucharacters.clear();
                            break;
                        }else {
                            tarcharacters.add(targetChar[j]);
                        }
                    }
                    if (i<source.length()){
                        if (sourceChar[i]==tarDiff){
                            tarcharacters.clear();
                            break;
                        }else {
                            soucharacters.add(sourceChar[i]);
                        }
                    }
                    i++;
                    j++;
                }
                if (tarcharacters.size()>0){
                    Yx target1 = new Yx("target", tempj, tarcharacters.size());
                    yxes.add(target1);
                    j=j-1;
                    i=tempi-1;
                }
                if (soucharacters.size()>0){
                    Yx target1 = new Yx("source", tempi, soucharacters.size());
                    yxes.add(target1);
                    if (tarcharacters.size()>0){
                        j=target.length()-1;
                        i=source.length()-1;
                    }else {
                        j=tempj-1;
                        i=i-1;
                    }
                }
            }
            i++;
            j++;
        }
        return yxes;
    }

    public List<Yx> diff0(String source ,String target){
        ArrayList<Yx> yxes = new ArrayList<>();
        char[] sourceChar = source.toCharArray();
        char[] targetChar = target.toCharArray();
        char souDiff='0';
        char tarDiff='0';
        int i=0,j=0;
        while (true){
            if (i==source.length()&&j<target.length()){
                Yx target1 = new Yx("target", j, target.length() - j);
                yxes.add(target1);
                break;
            }
            if (j==target.length()&&i<source.length()){
                Yx target1 = new Yx("source", i, source.length() - i);
                yxes.add(target1);
                break;
            }
            if (i==source.length()&&j==target.length()){
                break;
            }
            if (!(targetChar[j]==sourceChar[i])){
                ArrayList<Character> tarcharacters = new ArrayList<>();
                ArrayList<Character> soucharacters = new ArrayList<>();
                souDiff=sourceChar[i];
                tarDiff=targetChar[j];
                int souEquLoc=-1,tarEquLoc=-1;
                int tempi=i,tempj=j;
                li:while (true){
                    if (j>=target.length()&&i>=source.length()){
                        break;
                    }
                    if (j<target.length()){
                        if (soucharacters.size()==0){
                            if (targetChar[j]==souDiff){
                                soucharacters.clear();
                                break li;
                            }else {
                                tarcharacters.add(targetChar[j]);
                            }
                        }else {
                            for (int k=0;k<soucharacters.size();k++){
                                if (targetChar[j]==soucharacters.get(k)){
                                    souEquLoc=k;
                                    break li;
                                }
                            }

                            tarcharacters.add(targetChar[j]);
                        }
                    }
                    if (i<source.length()){
                        if (tarcharacters.size()==0){
                            if (sourceChar[i]==tarDiff){
                                tarcharacters.clear();
                                break li;
                            }else {
                                soucharacters.add(sourceChar[i]);
                            }
                        }else {
                            for (int m=0;m<tarcharacters.size();m++){
                                if (sourceChar[i]==tarcharacters.get(m)){
                                    tarEquLoc=m;
                                    break li;
                                }
                            }
                            soucharacters.add(sourceChar[i]);
                        }
                    }
                    i++;
                    j++;
                }
                if (souEquLoc==-1&&tarEquLoc==-1){
                    Yx source1 = new Yx("source", tempi, soucharacters.size());
                    Yx target1 = new Yx("target", tempj, tarcharacters.size());
                    yxes.add(source1);
                    yxes.add(target1);
                    i=source.length()-1;
                    j=target.length()-1;
                }else {
                    if (tarcharacters.size()>0&&tarEquLoc!=0){
                        if (souEquLoc==-1){
                            Yx target1 = new Yx("target", tempj, tarEquLoc);
                            yxes.add(target1);
                        }else {
                            Yx target1 = new Yx("target", tempj, tarcharacters.size());
                            yxes.add(target1);
                        }
                    }
                    if (soucharacters.size()>0&&souEquLoc!=0){
                        if (tarEquLoc==-1){
                            Yx target1 = new Yx("source", tempi, souEquLoc);
                            yxes.add(target1);
                        }else {
                            Yx target1 = new Yx("source", tempi, soucharacters.size());
                            yxes.add(target1);
                        }
                    }
                    if (souEquLoc==-1){
                        i=tempi+soucharacters.size()-1;
                        j=tempj+tarEquLoc-1;
                    }else {
                        j=tempj+tarcharacters.size()-1;
                        i=tempi+souEquLoc-1;
                    }
                }

            }
            i++;
            j++;
        }
        return yxes;
    }
    class Yx{
        //不同的地方存在哪个字符串
        public String type;
        //不同的地方的起始索引
        public Integer index;
        //不同的地方的长度
        public Integer length;

        public Yx(String type,Integer index,Integer length){
            this.type=type;
            this.index=index;
            this.length=length;
        }

        @Override
        public String toString() {
            return "[type:"+type+",index:"+index+",length:"+length+"]";
        }
    }
}

输出结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值