背景:
私はこの問題を長い間解決してきました。その中で、ファイルの 2 つのバージョンを比較し、変更を見つける必要がありました。ファイルの内容を配列の形式で抽出し、配列を比較することにしました。それから私は長い間愚かで間違いを犯し、最終的には箱の中の紙に配列を描きました。実は、この前に別の解決策を検討していました。しかし、とても複雑なので使いこなすことができませんでした:) さらに、古いファイルが長い場合と新しいファイルが長い場合に備えて、2つの異なるアルゴリズムがありました。好きじゃなかった。私の解決策の要点:
同一の配列が 2 つあります。本文全体を通じて、これらを「新しいアレイ」と「古いアレイ」と呼びます。そして、それぞれに新しい要素を挿入できます。それらの。参照配列は、すべてが削除された古いファイルの内容に対応するものとみなされます。古いファイルと新しいファイルの内容は、挿入を含む参照として扱われます。両方の配列 (古い配列と新しい配列の内容) をループで処理します。そして、そのうちの 1 つに挿入が検出された場合は、比較された配列の同じ要素が再び近くになるように 1 つのステップをスキップします。アルゴリズム:
変数: i - OLD ファイルの内容を含む配列セルのインデックス。nI - NEW ファイルの内容を含む配列セルのインデックス。配列の要素が異なる場合は、それらを一時変数に書き込みます。 oldMismatch - 積み重ねられた配列の要素 newMismatch - 新しい配列の要素 配列要素を反復処理する場合、次のケースが考えられます。-
oldMismatch 変数と newMismatch 変数は空です。2 つの配列の要素は同じです。Type.SAME をリストに書き込みます。どうぞ。
-
oldMismatch 変数と newMismatch 変数は空です。2 つの配列の要素は同じではありません。古い値から oldMismatch に値を書き込み、新しい値から newMismatch に値を書き込みます。どうぞ。
-
変数 oldMismatch と newMismatch は空ではありません。それらを配列の現在の要素と比較します。
結論を出しましょう。結果をリスト (lines 変数) に書き込みます。配列の 1 つのループ ステップをスキップします。
-
3.1 oldMismatch は NEW 配列の現在の要素と等しい。これは、ファイルに行が追加されたことを意味します。
この文字列の値は newMismatch に格納されます。そんな感じで書いてみましょう。
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
新しいファイルの内容を含む追加の要素が配列内にあるため、新しい配列を古い配列に対して 1 要素前方にシフトする必要があります。
したがって、OLD アレイは 1 ループ ステップをスキップします。
私 - ;
-
3.2 newMismatch は、OLD 配列の現在の要素と等しい。これは、ファイルから行が削除されたことを意味します。書き留めてみましょう。
lines.add(new LineItem(Type.REMOVED, oldMismatch)); lines.add(new LineItem(Type.SAME, newMismatch));
OLD 配列には追加の要素があります。これは、NEW 配列が 1 ループ ステップをスキップすることを意味します。
nI--;
-
-
配列の末尾を処理しています。そして今、私たちは古い配列の終わりに来ました。いくつかの状況が考えられます
-
4.1 - ArrayIndexOutOfBoundsException - 新しい配列は古い配列よりも短いです。ファイルの最後の行が削除されたことが記録されます。
-
4.2 - 新しい配列の最後の要素は残りますが、注目の対象にはなりません。追加したものとして記録させていただきます。
-
4.3 - 変数 oldMismatch と newMismatch が空ではありません。次のように書き留めます。
lines.add(new LineItem(Type.ADDED, newMismatch)); lines.add(new LineItem(Type.SAME, oldMismatch));
-
GO TO FULL VERSION