JavaRush /Java Blog /Random-TW /解決問題等級 19 任務 16 的選項(監控變化)
Anton Stezhkin
等級 41

解決問題等級 19 任務 16 的選項(監控變化)

在 Random-TW 群組發布

背景:

這個問題我解決了很久。其中有必要比較文件的兩個版本並尋找更改。我決定以數組的形式提取文件的內容並比較數組。然後我傻了很長一段時間,犯了錯誤,最後我在盒子裡的一張紙上畫了數組。實際上,在此之前我查看了另一種解決方案。但它太複雜了,我無法掌握:)此外,還有兩種不同的演算法,以防舊文件較長和新文件較長。我不喜歡它。

我的解決方案的要點:

有2個相同的數組。在整篇文章中,我將它們稱為「新數組」和「舊數組」。並且可以將新元素插入到每個元素中。那些。參考數組被認為是與所有刪除的舊文件的內容相對應的數組。新舊文件的內容被視為插入的參考。我們循環遍歷兩個數組(舊數組和新數組的內容)。如果我們偵測到其中一個存在插入,那麼我們會跳過一步,以便比較陣列的相同元素再次位於附近。

演算法:

變數: i - 包含 OLD 檔案內容的陣列單元的索引。nI - 包含新檔案內容的陣列單元的索引。如果數組的元素不同,我們將它們寫入臨時變數: oldMismatch - 堆疊數組中的元素 newMismatch - 新數組中的元素 迭代數組元素時,可能會出現以下情況:
  1. oldMismatch 和 newMismatch 變數為空。兩個數組中的元素相同。將 Type.SAME 寫入清單。前進。

  2. oldMismatch 和 newMismatch 變數為空。兩個數組中的元素不相同。我們將舊值寫入oldMismatch,將新值寫入newMismatch。前進。

  3. 變數 oldMismatch 和 newMismatch 不為空。我們將它們與數組的當前元素進行比較。

    讓我們得出結論。我們將結果寫入列表(行變數)。我們跳過其中一個陣列的循環步驟。

    1. 3.1 oldMismatch 等於NEW 陣列的目前元素。這意味著文件中新增了一行。

      該字串的值儲存在 newMismatch 中。我們就這樣寫下來吧。

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));

      由於數組中有一個附加元素包含新檔案的內容,因此需要將新數組元素相對於舊數組向前移動 1 個元素。

      因此,OLD 數組會跳過 1 個循環步驟。

      我 - ;

    2. 3.2 newMismatch 等於OLD 陣列的目前元素。這意味著一行已從文件中刪除。讓我們把它寫下來。

      lines.add(new LineItem(Type.REMOVED, oldMismatch));
       lines.add(new LineItem(Type.SAME, newMismatch));

      OLD 數組中有一個附加元素。這表示 NEW 陣列跳過 1 個循環步驟。

      你 - ;

  4. 處理數組的末端。現在我們已經到了舊數組的最後。有幾種可能的情況

    1. 4.1 - ArrayIndexOutOfBoundsException - 新陣列比舊數組短。我們記錄文件的最後一行被刪除。

    2. 4.2 - 新陣列的最後一個元素仍然存在,沒有被我們的注意力覆蓋。我們將其記錄為已新增的。

    3. 4.3 - 變數 oldMismatch 和 newMismatch 不為空。我們寫下:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - 不要忘記重置變數並追蹤 nI 變數。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION