JavaRush /Blog Java /Random-MS /Pilihan untuk menyelesaikan masalah tahap 19 tugas 16 (me...

Pilihan untuk menyelesaikan masalah tahap 19 tugas 16 (memantau perubahan)

Diterbitkan dalam kumpulan

latar belakang:

Saya menyelesaikan masalah ini untuk masa yang sangat lama . Di dalamnya adalah perlu untuk membandingkan 2 versi fail dan mencari perubahan. Saya memutuskan untuk mengekstrak kandungan fail dalam bentuk tatasusunan dan membandingkan tatasusunan. Kemudian saya menjadi bodoh untuk masa yang lama dan melakukan kesilapan dan akhirnya saya melukis tatasusunan pada sekeping kertas dalam kotak. Sebenarnya sebelum ni saya tengok penyelesaian lain . Tetapi ia sangat rumit sehingga saya tidak dapat menguasainya :) Selain itu, terdapat 2 algoritma berbeza sekiranya fail lama lebih panjang dan jika fail baharu lebih panjang. Saya tidak sukakannya.

Inti penyelesaian saya:

Terdapat 2 tatasusunan yang sama. Sepanjang teks saya akan memanggil mereka "tatasusunan baru" dan "tatasusunan lama". Dan elemen baru boleh dimasukkan ke dalam setiap daripada mereka. Itu. Tatasusunan rujukan dianggap sebagai yang sepadan dengan kandungan fail lama dengan semua pemadaman. Kandungan fail lama dan baharu dianggap sebagai rujukan dengan sisipan. Kami melalui kedua-dua tatasusunan (kandungan lama dan baharu) dalam satu gelung. Dan jika kami mengesan sisipan dalam salah satu daripadanya, maka kami melangkau satu langkah supaya unsur tatasusunan yang sama berada berdekatan sekali lagi.

Algoritma:

Pembolehubah: i - indeks sel tatasusunan dengan kandungan fail LAMA. nI - indeks sel tatasusunan dengan kandungan fail BARU. Jika elemen tatasusunan berbeza, kami menulisnya ke dalam pembolehubah sementara: oldMismatch - elemen daripada tatasusunan bertindan newMismatch - elemen daripada tatasusunan baharu Apabila melelakan elemen tatasusunan, kes berikut adalah mungkin:
  1. pembolehubah lamaMismatch dan newMismatch kosong. Elemen dalam dua tatasusunan adalah sama. Tulis Jenis.SAMA kepada senarai. Teruskan.

  2. pembolehubah lamaMismatch dan newMismatch kosong. Unsur-unsur dalam dua tatasusunan TIDAK sama. Kami menulis nilai dari yang lama kepada OldMismatch, daripada yang baharu kepada newMismatch. Teruskan.

  3. pembolehubah oldMismatch dan newMismatch TIDAK kosong. Kami membandingkannya dengan elemen semasa tatasusunan.

    Mari buat kesimpulan. Kami menulis penemuan ke senarai (pembolehubah baris). Kami melangkau langkah gelung untuk salah satu tatasusunan.

    1. 3.1 oldMismatch adalah sama dengan elemen semasa tatasusunan BARU. Ini bermakna satu baris telah ditambahkan pada fail.

      Nilai rentetan ini disimpan dalam newMismatch. Mari kita menulisnya seperti itu.

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

      Memandangkan terdapat elemen tambahan dalam tatasusunan yang mengandungi kandungan fail baharu, anda perlu mengalihkan elemen tatasusunan 1 baharu ke hadapan berbanding yang lama.

      Oleh itu, tatasusunan LAMA melangkau 1 langkah gelung.

      saya--;

    2. 3.2 newMismatch adalah sama dengan elemen semasa tatasusunan LAMA. Ini bermakna satu baris telah dialih keluar daripada fail. Mari kita menulisnya.

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

      Terdapat elemen tambahan dalam tatasusunan LAMA. Ini bermakna tatasusunan BARU melangkau 1 langkah gelung.

      nI--;

  4. Memproses hujung tatasusunan. Dan kini kita telah sampai ke penghujung tatasusunan lama. Terdapat beberapa kemungkinan situasi

    1. 4.1 - ArrayIndexOutOfBoundsException - tatasusunan baharu adalah lebih pendek daripada yang lama. Kami merekodkan bahawa baris terakhir fail telah dipadamkan.

    2. 4.2 - Elemen terakhir tatasusunan baharu kekal, tidak dilindungi oleh perhatian kami. Kami merekodkannya sebagai tambahan.

    3. 4.3 - Pembolehubah oldMismatch dan newMismatch tidak kosong. Kami menulis:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - jangan lupa untuk menetapkan semula pembolehubah dan menjejaki pembolehubah nI.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION