基本上,我已经完成了我的程序,因此它会显示字符串的差异并显示整行。我想突出(在一种颜色中)线条的差异。
示例:
Original at line 5
<rect x="60.01" width="855.38" id="rect_1" y="-244.35" height="641.13" style="stroke-width: 1; stroke: rgb(0, 0, 0); fill: none; "/>
Edited at line 5
<rect x="298.43" width="340.00" y="131.12" height="380.00" id="rect_1" style="stroke-width: 1; stroke: rgb(0, 0, 0); fill: rgb(255, 102, 0); "/>
在此示例中,宽度与“已编辑”版本中的“原始”不同。我希望能够强调这种差异和任何其他差异。
到目前为止我的代码:
Patch patch = DiffUtils.diff(centralFile, remoteFile);
StringBuffer resultsBuff = new StringBuffer(remoteFileData.length);
for (Delta delta : patch.getDeltas())
{
resultsBuff.append("Original at line " + delta.getOriginal().getPosition() + "\n");
for (Object line : delta.getOriginal().getLines())
{
resultsBuff.append(" " + line + "\n");
}
resultsBuff.append("Edited at line " + delta.getRevised().getPosition() + "\n");
for (Object line : delta.getRevised().getLines())
{
resultsBuff.append(" " + line + "\n");
}
resultsBuff.append("\n");
}
return resultsBuff.toString();
}
这将显示两个完整的行,如之前的示例(原始版本和编辑版本)我希望能够突出显示已经实现的更改,有没有办法在Java中执行此操作?
答案 0 :(得分:0)
您尝试重写WinDiff和Beyond Compare等常用工具的任何特殊原因?
万一你真的需要它:
主要的困难是找到差异停止的地方
<rect x="60.01" width="855.38" id="rect_1" y="-244.35" height="641.13" style="stroke-width: 1; stroke: rgb(0, 0, 0); fill: none; "/>
<rect x="298.43" width="340.00" y="131.12" height="380.00" id="rect_1" style="stroke-width: 1; stroke: rgb(0, 0, 0); fill: rgb(255, 102, 0); "/>
你认为差异是什么?
1)改变“x”和“宽度”的值很容易 - 它们的顺序相同
2)你觉得“id”和它的价值有什么关系?你想如何突出它?
假设你总是知道哪个是“原始”
我建议你扫描“原始”字符串,标记它,分别匹配每个标记并删除匹配的标记。当你耗尽所有“原始”代币时,你就开始突出显示“原始”和“编辑”剩余部分的差异。
答案 1 :(得分:0)
Diff匹配补丁是Java提供的库,允许您生成像html这样的差异查看器。也许它对你有帮助吗? http://code.google.com/p/google-diff-match-patch/
答案 2 :(得分:0)
要回答您提出的问题,这取决于您显示整个文本的方式。我可以想到两种方式,我相信还有其他方式。
答案 3 :(得分:0)
我找到了一种更简单的方法。我已经将每一行保存到一个字符串数组中(拆分每个元素/参数),按字母顺序排序字符串然后比较字符串。列出已更改的那些。
resultsBuff.append("\nEdited at line " + delta.getRevised().getPosition() + "\n");
for (Object line : delta.getRevised().getLines())
{
String xmlLineEdit = line.toString();//save 'original' xml line into string
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(xmlLineEdit));//put xml into parser
xsr.nextTag(); // Advance to svg element
int attributeCount = xsr.getAttributeCount();//get the number of attributes
array1 = new String[attributeCount];
for(int x=0; x<attributeCount; x++) //for each attribute
{
//StringBuilder stringBuilder = new StringBuilder();//might remove
array1[x]= xsr.getAttributeLocalName(x) + "=\"" + xsr.getAttributeValue(x) + "\"";//add attributes and values to an array
}
Arrays.sort(array1);//sort the array alphabetically