Menemukan Perbedaan Antara Dua Daftar di Jawa

1. Ikhtisar

Menemukan perbedaan antara kumpulan objek dengan tipe data yang sama adalah tugas pemrograman yang umum. Sebagai contoh, bayangkan kita memiliki daftar siswa yang mendaftar untuk ujian dan daftar siswa lain yang lulus. Perbedaan antara kedua daftar itu akan memberi kita siswa yang tidak lulus ujian.

Di Java , tidak ada cara eksplisit untuk menemukan perbedaan antara dua daftar di List API, meskipun ada beberapa metode pembantu yang mendekati.

Dalam tutorial singkat ini, kita akan melihat bagaimana menemukan perbedaan antara kedua daftar tersebut . Kami akan mencoba beberapa pendekatan berbeda, termasuk Java biasa (dengan dan tanpa Stream ) dan menggunakan pustaka pihak ketiga seperti Guava dan Koleksi Apache Commons .

2. Pengaturan Tes

Mari kita mulai dengan mendefinisikan dua daftar, yang akan kita gunakan untuk menguji contoh kita:

public class FindDifferencesBetweenListsUnitTest { private static final List listOne = Arrays.asList("Jack", "Tom", "Sam", "John", "James", "Jack"); private static final List listTwo = Arrays.asList("Jack", "Daniel", "Sam", "Alan", "James", "George"); }

3. Menggunakan Java List API

Kita bisa membuat salinan dari satu daftar dan kemudian menghapus semua elemen yang sama dengan yang lain , menggunakan metode Daftar removeAll () :

List differences = new ArrayList(listOne); differences.removeAll(listTwo); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");

Mari kita balikkan ini untuk menemukan perbedaan sebaliknya:

List differences = new ArrayList(listTwo); differences.removeAll(listOne); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Daniel", "Alan", "George");

Kita juga harus mencatat bahwa jika kita ingin menemukan elemen umum di antara dua daftar, List juga berisi metode retensiSemua .

4. Menggunakan Streams API

Java Stream dapat digunakan untuk melakukan operasi berurutan pada data dari koleksi, yang mencakup pemfilteran perbedaan antara daftar :

List differences = listOne.stream() .filter(element -> !listTwo.contains(element)) .collect(Collectors.toList()); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");

Seperti pada contoh pertama kita, kita dapat mengganti urutan daftar untuk menemukan elemen yang berbeda dari daftar kedua:

List differences = listTwo.stream() .filter(element -> !listOne.contains(element)) .collect(Collectors.toList()); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Daniel", "Alan", "George");

Kita harus mencatat bahwa pemanggilan List yang berulang . contains () dapat menjadi operasi yang mahal untuk daftar yang lebih besar.

5. Menggunakan Perpustakaan Pihak Ketiga

5.1. Menggunakan Google Guava

Jambu biji berisi set praktis . perbedaan metode , tetapi untuk menggunakannya kita harus terlebih dahulu mengubah Daftar kitamenjadi Set :

List differences = new ArrayList(Sets.difference(Sets.newHashSet(listOne), Sets.newHashSet(listTwo))); assertEquals(2, differences.size()); assertThat(differences).containsExactlyInAnyOrder("Tom", "John");

Kita harus mencatat bahwa mengubah Daftar ke Kumpulan akan memiliki efek menduplikasi dan menyusun ulang.

5.2. Menggunakan Koleksi Apache Commons

Kelas CollectionUtils dari Apache Commons Collections berisi metode removeAll .

Metode ini melakukan hal yang sama seperti Daftar . removeAll , sekaligus membuat koleksi baru untuk hasilnya :

List differences = new ArrayList((CollectionUtils.removeAll(listOne, listTwo))); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");

6. Menangani Nilai Duplikat

Sekarang mari kita lihat menemukan perbedaan ketika dua daftar berisi nilai duplikat.

Untuk mencapai ini, kita perlu menghapus elemen duplikat dari daftar pertama, persis sebanyak yang ada di daftar kedua.

Dalam contoh kami, nilai "Jack" muncul dua kali di daftar pertama dan hanya sekali di daftar kedua:

List differences = new ArrayList(listOne); listTwo.forEach(differences::remove); assertThat(differences).containsExactly("Tom", "John", "Jack");

Kami juga dapat mencapai ini menggunakan metode pengurangan dari Apache Commons Collections :

List differences = new ArrayList(CollectionUtils.subtract(listOne, listTwo)); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Tom", "John", "Jack");

7. Kesimpulan

Dalam artikel ini, kami menjelajahi beberapa cara untuk menemukan perbedaan di antara daftar .

Dalam contoh, kami membahas solusi Java dasar , solusi menggunakan Streams API, dan dengan pustaka pihak ketiga seperti Koleksi Google Guava dan Apache Commons.

Kami juga melihat bagaimana menangani nilai duplikat.

Seperti biasa, kode sumber lengkap tersedia di GitHub.