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();
        }

前の例のように 2 行全体が表示されます (元のバージョンと編集されたバージョン) 実際に行われた変更を強調表示できるようにしたいのですが、Java でこれを行う方法はありますか?

4

4 に答える 4

0

差分一致パッチはJavaで利用可能なライブラリであり、htmlのような差分ビューアを生成できます。多分それはあなたの助けになることができますか?http://code.google.com/p/google-diff-match-patch/

于 2012-08-29T14:03:46.407 に答える
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 に答える
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

あなたが尋ねた質問に答えるには、テキスト全体を表示する方法によって異なります。2つの方法が考えられますが、他にもあると確信しています。

  1. 最も簡単な方法は、println() を使用して System.out にファイルを書き出すことです。これにより、ファイルの内容が Eclipse コンソールにダンプされます。何かを強調表示するには、その行を System.out ではなく System.err に書き込みます。その結果、その行はコンソールに赤で書き込まれます。これにより、変更を強調表示する最も簡単な方法が得られますが、それは行レベルであり、文字レベルではありません。
  2. さらに、Eclipse の比較ツールのようなツールを作成していると、非常に複雑になります。何が変更されたかを判断したら (この質問の範囲外だと思います)、ツール UI を構築してそれらの変更を表示するために使用できるウィジェットがあります。そのようなウィジェットの 1 つが StyledText ウィジェットです。これは、テキスト範囲ベースで色、フォント、その他のテキスト属性を制御できるテキスト ウィジェットです。
于 2012-08-29T14:13:53.583 に答える