突出Java中的变化

时间:2012-08-29 13:33:27

标签: java eclipse string for-loop

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

示例:

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 个答案:

答案 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)

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

  1. 最简单的方法是使用println()将文件写入System.out。这会将文件内容转储到Eclipse控制台。要突出显示某些内容,请将该行写入System.err而不是System.out,从而导致该行以红色写入控制台。这为您提供了最简单的方法来突出显示更改,但它是在行级而不是字符级别。
  2. 除此之外,当您编写某种工具(如Eclipse中的比较工具)时,事情变得非常复杂。一旦确定了哪些内容发生了变化(我认为这不在本问题范围内),您可以使用小部件来构建工具UI以显示这些更改。一个这样的小部件是StyledText小部件,它是一个文本小部件,可以在文本范围内控制颜色,字体和其他文本属性。

答案 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