【问题标题】:Highlighting Changes in Java突出 Java 的变化
【发布时间】:2012-08-29 13:33:27
【问题描述】:

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

例子:

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

【问题讨论】:

  • 我希望能够突出显示实际所做的更改,有没有办法做到这一点?这里有太多人花太多时间批评人们的“问题”,而不是真正帮助别人。
  • "highlight (in a colour)" 这个“颜色”是什么?是在网络应用程序中吗?桌面富客户端 GUI?命令行界面?万花筒?
  • @AndrewThompson webapp。任何颜色。
  • “这里有太多人花太多时间批评人们的“问题”,而不是真正帮助他人。” 太多人脱口而出,希望能说出格式不正确的问题描述我们可以凭直觉提出问题,而不是思考如何提出问题。
  • 你的问题太模糊了。我们需要一个简洁、可解决的问题。只是举起你的手说,“我是怎么做到的?!”是一个微弱的尝试。当有很多其他人做更多的功课时,我们为什么要花时间哄你的问题?

标签: java eclipse string for-loop


【解决方案1】:

您尝试重写 WinDiff 和 Beyond Compare 等常用工具的任何特定原因?
如果您真的需要它:
主要困难是找到差异停止的地方
&lt;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; "/&gt;
&lt;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); "/&gt;

您认为有什么不同?
1) "x" 和 "width" 的改变值很容易 - 它们以相同的顺序出现
2)你认为“id”发生了什么,它的价值是什么?您想如何突出显示它?

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

【讨论】:

  • “价值”是我想强调的。似乎是个好主意,谢谢!
  • 抱歉,“价值”是什么意思? “原始”中的“60.01”和“编辑”中的“298.43”?一旦你完成了匹配的标记,你可以通过进一步标记它们来比较不匹配的标记,这就是很难找到变化的地方——在未格式化的数据上几乎是不可能的。考虑“原始”:id1="1" id2="2" 和“编辑”:id2="1" id1="2"
  • 是的,理想情况下会突出显示“60.01”。可能是个问题,因为我不知道为什么它有时会吐出未格式化的字符串:S!
  • 有时我只是想知道这里的某些人发现将某人的答案标记为“无用/无用”的原因是什么?他们如何决定什么有用,什么没用?
  • 我不会担心,这个网站50%的人都有一定的傲慢和态度问题,因为他们认为他们比你更好。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我找到了一种更简单的方法来做到这一点。我已将每一行保存到一个字符串数组中(拆分每个元素/参数),按字母顺序对字符串进行排序,然后比较字符串。列出已更改的内容。

      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
      

      【讨论】:

      • 它与我建议的方法有何不同?
      • 我问了关于比较顺序的问题 - 如果是您的特定字符串,属性的顺序可能并不重要,但如果您使用(如您应该)相同的代码来比较一般文本和/或源代码令牌的顺序变得很重要:x++; y=x; 产生与y=x; x++; 完全不同的结果。因此,向您的函数添加一个允许您忽略或考虑令牌顺序的参数是有意义的。
      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2018-09-23
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多