背景:
這個問題我解決了很久。其中有必要比較文件的兩個版本並尋找更改。我決定以數組的形式提取文件的內容並比較數組。然後我傻了很長一段時間,犯了錯誤,最後我在盒子裡的一張紙上畫了數組。實際上,在此之前我查看了另一種解決方案。但它太複雜了,我無法掌握:)此外,還有兩種不同的演算法,以防舊文件較長和新文件較長。我不喜歡它。我的解決方案的要點:
有2個相同的數組。在整篇文章中,我將它們稱為「新數組」和「舊數組」。並且可以將新元素插入到每個元素中。那些。參考數組被認為是與所有刪除的舊文件的內容相對應的數組。新舊文件的內容被視為插入的參考。我們循環遍歷兩個數組(舊數組和新數組的內容)。如果我們偵測到其中一個存在插入,那麼我們會跳過一步,以便比較陣列的相同元素再次位於附近。演算法:
變數: i - 包含 OLD 檔案內容的陣列單元的索引。nI - 包含新檔案內容的陣列單元的索引。如果數組的元素不同,我們將它們寫入臨時變數: oldMismatch - 堆疊數組中的元素 newMismatch - 新數組中的元素 迭代數組元素時,可能會出現以下情況:-
oldMismatch 和 newMismatch 變數為空。兩個數組中的元素相同。將 Type.SAME 寫入清單。前進。
-
oldMismatch 和 newMismatch 變數為空。兩個數組中的元素不相同。我們將舊值寫入oldMismatch,將新值寫入newMismatch。前進。
-
變數 oldMismatch 和 newMismatch 不為空。我們將它們與數組的當前元素進行比較。
讓我們得出結論。我們將結果寫入列表(行變數)。我們跳過其中一個陣列的循環步驟。
-
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 個循環步驟。
你 - ;
-
-
處理數組的末端。現在我們已經到了舊數組的最後。有幾種可能的情況
-
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