JavaRush /Java Blog /Random-ID /Pilihan untuk memecahkan masalah level 19 tugas 16 (meman...
Anton Stezhkin
Level 41

Pilihan untuk memecahkan masalah level 19 tugas 16 (memantau perubahan)

Dipublikasikan di grup Random-ID

Latar belakang:

Saya memecahkan masalah ini untuk waktu yang sangat lama . Di dalamnya perlu membandingkan 2 versi file dan menemukan perubahan. Saya memutuskan untuk mengekstrak isi file dalam bentuk array dan membandingkan arraynya. Lalu saya lama-lama bodoh dan melakukan kesalahan dan pada akhirnya saya menggambar susunan di selembar kertas di dalam kotak. Sebenarnya, sebelum ini saya mencari solusi lain . Tapi ini sangat rumit sehingga saya tidak bisa menguasainya :) Selain itu, ada 2 algoritma berbeda jika file lama lebih panjang dan jika file baru lebih panjang. Aku tidak menyukainya.

Inti dari solusi saya:

Ada 2 array yang identik. Di seluruh teks saya akan menyebutnya "array baru" dan "array lama". Dan elemen baru dapat dimasukkan ke dalamnya masing-masing. Itu. Array referensi dianggap sesuai dengan konten file lama dengan semua penghapusan. Isi file lama dan baru diperlakukan sebagai referensi dengan sisipan. Kami menelusuri kedua array (isi yang lama dan yang baru) dalam satu lingkaran. Dan jika kita mendeteksi penyisipan di salah satunya, maka kita lewati satu langkah sehingga elemen yang sama dari array yang dibandingkan kembali berada di dekatnya.

Algoritma:

Variabel: i - indeks sel array dengan isi file LAMA. nI - indeks sel array dengan konten file BARU. Jika elemen array berbeda, kita menuliskannya ke dalam variabel sementara: oldMismatch - elemen dari array bertumpuk newMismatch - elemen dari array baru Saat melakukan iterasi pada elemen array, kasus berikut mungkin terjadi:
  1. variabel oldMismatch dan newMismatch kosong. Elemen dalam kedua array itu sama. Tulis Type.SAME ke daftar. Teruskan.

  2. variabel oldMismatch dan newMismatch kosong. Elemen dalam kedua array TIDAK sama. Kita menulis nilai dari yang lama ke yang lamaMismatch, dari yang baru ke yang baruMismatch. Teruskan.

  3. variabel oldMismatch dan newMismatch TIDAK kosong. Kami membandingkannya dengan elemen array saat ini.

    Mari kita menarik kesimpulan. Kami menulis temuan ke daftar (variabel garis). Kami melewatkan langkah perulangan untuk salah satu array.

    1. 3.1 oldMismatch sama dengan elemen array BARU saat ini. Ini berarti bahwa sebuah baris telah ditambahkan ke file.

      Nilai string ini disimpan di newMismatch. Mari kita tulis seperti itu.

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

      Karena ada elemen tambahan dalam array yang berisi konten file baru, Anda perlu menggeser elemen array baru 1 ke depan relatif terhadap yang lama.

      Oleh karena itu, array OLD melewatkan 1 langkah perulangan.

      Saya--;

    2. 3.2 newMismatch sama dengan elemen array OLD saat ini. Ini berarti ada satu baris yang telah dihapus dari file. Mari kita tuliskan.

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

      Ada elemen tambahan dalam array OLD. Ini berarti array BARU melewatkan 1 langkah perulangan.

      aku--;

  4. Memproses akhir array. Dan sekarang kita telah sampai pada akhir dari susunan yang lama. Ada beberapa kemungkinan situasi

    1. 4.1 - ArrayIndexOutOfBoundsException - array baru lebih pendek dari array lama. Kami mencatat bahwa baris terakhir file telah dihapus.

    2. 4.2 - Elemen terakhir dari array baru tetap ada, tidak tercakup dalam perhatian kita. Kami mencatatnya sebagai tambahan.

    3. 4.3 - Variabel oldMismatch dan newMismatch tidak kosong. Kami menuliskan:

      lines.add(new LineItem(Type.ADDED, newMismatch));
      lines.add(new LineItem(Type.SAME, oldMismatch));
PS - jangan lupa untuk mereset variabel dan memantau variabel nI.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION