JavaRush /Blog Java /Random-VI /Phương án giải bài toán cấp 19 nhiệm vụ 16 (theo dõi sự t...
Anton Stezhkin
Mức độ

Phương án giải bài toán cấp 19 nhiệm vụ 16 (theo dõi sự thay đổi)

Xuất bản trong nhóm

Lý lịch:

Tôi đã giải quyết vấn đề này trong một thời gian rất dài . Trong đó cần phải so sánh 2 phiên bản của tệp và tìm ra những thay đổi. Tôi quyết định trích xuất nội dung của các tệp dưới dạng mảng và so sánh các mảng. Sau đó tôi ngu ngốc một thời gian dài và mắc lỗi và cuối cùng tôi đã vẽ các mảng trên một tờ giấy đựng trong hộp. Thực ra, trước đó tôi đã xem xét một giải pháp khác . Nhưng nó phức tạp quá nên mình không làm chủ được :) Ngoài ra còn có 2 thuật toán khác nhau trường hợp file cũ dài hơn và file mới dài hơn. Tôi không thích nó.

Ý chính của giải pháp của tôi:

Có 2 mảng giống hệt nhau. Trong suốt bài viết, tôi sẽ gọi chúng là “mảng mới” và “mảng cũ”. Và các phần tử mới có thể được chèn vào từng phần tử đó. Những thứ kia. Mảng tham chiếu được coi là mảng tương ứng với nội dung của tệp cũ với tất cả các thao tác xóa. Nội dung của tệp cũ và tệp mới được coi là tham chiếu có phần chèn. Chúng ta duyệt qua cả hai mảng (nội dung cũ và mới) trong một vòng lặp. Và nếu chúng tôi phát hiện phần chèn vào một trong số chúng, thì chúng tôi sẽ bỏ qua một bước để các phần tử tương tự của mảng được so sánh lại ở gần đó.

Thuật toán:

Biến: i - chỉ mục của ô mảng có nội dung của tệp OLD. nI - chỉ mục của ô mảng với nội dung của tệp MỚI. Nếu các phần tử của mảng khác nhau, chúng ta viết chúng thành các biến tạm thời: oldMismatch - một phần tử từ một mảng xếp chồng newMismatch - một phần tử từ một mảng mới Khi lặp qua các phần tử mảng, có thể xảy ra các trường hợp sau:
  1. các biến oldMismatch và newMismatch trống. Các phần tử trong hai mảng đều giống nhau. Viết Type.SAME vào danh sách. Hãy tiếp tục.

  2. các biến oldMismatch và newMismatch trống. Các phần tử trong hai mảng KHÔNG giống nhau. Chúng ta viết giá trị từ giá trị cũ sang oldMismatch, từ giá trị mới sang newMismatch. Hãy tiếp tục.

  3. các biến oldMismatch và newMismatch KHÔNG trống. Chúng tôi so sánh chúng với các phần tử hiện tại của mảng.

    Hãy rút ra kết luận. Chúng tôi viết những phát hiện vào một danh sách (biến dòng). Chúng tôi bỏ qua bước lặp cho một trong các mảng.

    1. 3.1 oldMismatch bằng phần tử hiện tại của mảng MỚI. Điều này có nghĩa là một dòng đã được thêm vào tập tin.

      Giá trị của chuỗi này được lưu trữ trong newMismatch. Hãy viết nó ra như thế.

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

      Vì có một phần tử bổ sung trong mảng chứa nội dung của tệp mới, bạn cần dịch chuyển phần tử mảng 1 mới về phía trước so với phần tử cũ.

      Do đó, mảng OLD bỏ qua 1 bước vòng lặp.

      Tôi--;

    2. 3.2 newMismatch bằng phần tử hiện tại của mảng OLD. Điều này có nghĩa là một dòng đã bị xóa khỏi tệp. Hãy viết nó ra.

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

      Có một phần tử bổ sung trong mảng OLD. Điều này có nghĩa là mảng MỚI bỏ qua 1 bước vòng lặp.

      nI--;

  4. Xử lý phần cuối của mảng. Và bây giờ chúng ta đã đi đến hết mảng cũ. Có một số tình huống có thể xảy ra

    1. 4.1 - ArrayIndexOutOfBoundsException - mảng mới ngắn hơn mảng cũ. Chúng tôi ghi lại rằng dòng cuối cùng của tập tin đã bị xóa.

    2. 4.2 - Phần tử cuối cùng của mảng mới vẫn còn, không được chúng ta chú ý. Chúng tôi ghi lại nó như đã thêm.

    3. 4.3 - Các biến oldMismatch và newMismatch không được trống. Chúng tôi viết ra:

      
      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
Tái bút - đừng quên đặt lại các biến và theo dõi biến nI.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION