0

基本上,我已经完成了我的程序,以便它显示字符串的差异并显示整行。我想突出显示(以颜色)线条中的差异。

例子:

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 中做到这一点?

4

4 回答 4

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”和“width”的改变值很容易——它们以相同的顺序出现
2)你认为“id”发生了什么,它的值是什么?你想如何突出它?

假设您总是知道哪个是
“原始”字符串,我建议您扫描“原始”字符串,对其进行标记,分别匹配每个标记并删除匹配的标记。当您用尽所有“原始”标记时,您才开始突出显示“原始”和“已编辑”其余部分的差异。

于 2012-08-29T13:56:37.163 回答
0

Diff match patch 是 Java 中可用的库,可让您生成 diff 查看器,如 html。也许它对你有帮助?http://code.google.com/p/google-diff-match-patch/

于 2012-08-29T14:03:46.407 回答
0

要回答您提出的问题,这取决于您显示整个文本的方式。我可以想到两种方法,我相信还有其他方法。

  1. 最简单的方法是使用 println() 将文件写入 System.out。这会将文件内容转储到 Eclipse 控制台。要突出显示某些内容,请将该行写入 System.err 而不是 System.out 导致该行以红色写入控制台。这为您提供了突出显示更改的最简单方法,但它是在行级别而不是字符级别。
  2. 除此之外,当您编写某种工具(如 Eclipse 中的比较工具)时,事情会变得非常复杂。一旦您确定了发生了什么变化(我认为这超出了这个问题的范围),您可以使用一些小部件来构建工具 UI 来显示这些变化。一个这样的小部件是 StyledText 小部件,它是一种文本小部件,可让您在文本范围的基础上控制颜色、字体和其他文本属性。
于 2012-08-29T14:13:53.583 回答
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
于 2012-08-30T09:36:46.563 回答