2012-08-29 65 views
0

基本上,我已經完成了我的程序,以便它將顯示字符串中的差異並顯示整行。我想突出(用一種顏色)線上的差異。突出顯示Java中的變化

實施例:

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中做到這一點?

+1

什麼問題? –

+1

我希望能夠突出顯示實際進行的更改,無論如何可以做到這一點?太多人在這裏花太多時間批評人們的問題,而不是實際幫助別人。 –

+0

*「突出顯示(用一種顏色)」*這是什麼顏色?它是在一個網絡應用程序。?桌面富客戶端GUI?一個命令行界面?萬花筒? –

回答

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」發生了什麼,它的價值?你想如何突出它?

假設你總是知道哪個是「原始」
我建議你掃描「原始」字符串,對它進行標記,分別匹配每個標記並刪除匹配的標記。當你耗盡所有「原始」標記時,只有當你開始突出顯示「原始」和「編輯」的其餘部分的差異時。

+0

''的價值是我想強調的。似乎是個好主意,謝謝! –

+0

對不起,您的意思是「價值」? 「原始」中的「60.01」和「編輯」中的「298.43」?一旦你完成匹配的令牌,你可以通過將它們進一步標記化來比較無與倫比的令牌,也就是說,難以找到變化的地方 - 對於未格式化的數據幾乎是不可能的。考慮「原創」:'id1 =「1」id2 =「2」'和「編輯」:'id2 =「1」id1 =「2」' –

+0

是的,像「60.01」會突出顯示,理想情況。可能是一個問題,因爲我不知道爲什麼它有時會吐出未格式化的字符串:S! –

0

要回答你問的問題,它取決於你顯示整個文本的方式。我可以想到兩種方式,我確定還有其他方法。

  1. 最簡單的方法是使用println()將文件寫出到System.out中。這會將文件內容轉儲到Eclipse控制檯。要突出顯示某些內容,請將該行寫入System.err而不是System.out,從而導致該行以紅色寫入控制檯。這爲您提供突出顯示更改的最簡單方法,但它處於行級別而不是角色級別。
  2. 除了這些,事情變得非常複雜,因爲您正在編寫某種工具,比如Eclipse中的比較工具。一旦你確定了什麼已經改變(我認爲這超出了這個問題的範圍),你可以使用構件工具UI來顯示這些改變。一個這樣的小部件是StyledText小部件,它是一個文本小部件,可以在文本範圍的基礎上控制顏色,字體和其他文本屬性。
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 
+0

它與我建議的方法有什麼不同? –

+0

我詢問了有關比較訂單的情況 - 在特定字符串的情況下,屬性的順序可能並不重要,但如果您使用(如您應該)相同的代碼來比較一般文本和/或源代碼,令牌的順序變爲重要的: 'x ++; y = x;'產生與y = x完全不同的結果; X ++;'。 因此,向你的函數添加一個參數是有意義的,它可以讓你忽略或考慮令牌的順序。 –