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+"]"; } } }
输出结果: