Atur Operasi di Java

1. Perkenalan

Satu set adalah cara praktis untuk merepresentasikan koleksi item yang unik.

Dalam tutorial ini, kita akan belajar lebih banyak tentang apa artinya itu dan bagaimana kita bisa menggunakannya di Java.

2. Sedikit Teori Himpunan

2.1. Apa Itu Set?

Satu set hanyalah sekelompok hal unik. Jadi, karakteristik penting dari setiap set adalah tidak mengandung duplikat .

Kita bisa memasukkan apapun yang kita suka ke dalam satu set. Namun, kami biasanya menggunakan set untuk mengelompokkan hal-hal yang memiliki ciri umum. Misalnya, kita bisa memiliki satu set kendaraan atau satu set hewan.

Mari gunakan dua set bilangan bulat sebagai contoh sederhana:

setA : {1, 2, 3, 4} setB : {2, 4, 6, 8}

Kita dapat menunjukkan set sebagai diagram hanya dengan memasukkan nilai ke dalam lingkaran:

Diagram seperti ini dikenal sebagai diagram Venn dan memberi kita cara yang berguna untuk menunjukkan interaksi antar set seperti yang akan kita lihat nanti.

2.2. Persimpangan Set

Perpotongan istilah berarti nilai persekutuan dari himpunan yang berbeda .

Kita dapat melihat bahwa bilangan bulat 2 dan 4 ada di kedua himpunan. Jadi perpotongan setA dan setB adalah 2 dan 4 karena ini adalah nilai yang sama untuk kedua set kita.

setA intersection setB = {2, 4}

Untuk menunjukkan perpotongan dalam diagram, kami menggabungkan dua set kami dan menyorot area yang sama untuk kedua set kami:

2.3. The Union of Sets

Istilah gabungan berarti menggabungkan nilai-nilai dari himpunan yang berbeda .

Jadi mari kita buat satu set baru yang merupakan gabungan dari set contoh kita. Kita sudah tahu bahwa kita tidak bisa memiliki nilai duplikat dalam satu set. Namun, set kami memiliki beberapa nilai duplikat (2 dan 4). Jadi ketika kami menggabungkan konten dari kedua set, kami perlu memastikan kami menghapus duplikat. Jadi kita berakhir dengan 1, 2, 3, 4, 6 dan 8.

setA union setB = {1, 2, 3, 4, 6, 8}

Sekali lagi kita bisa menunjukkan penyatuan dalam diagram. Jadi mari kita gabungkan dua set kita dan sorot area yang mewakili penyatuan:

2.4. Pelengkap Relatif dari Set

Istilah pelengkap relatif berarti nilai-nilai dari satu himpunan yang tidak ada di himpunan lain . Ini juga disebut sebagai perbedaan yang ditetapkan.

Sekarang mari kita buat set baru yang merupakan pelengkap relatif dari setA dan setB .

relative complement of setA in setB = {6, 8} relative complement of setB in setA = {1, 3}

Dan sekarang, mari kita sorot area di setA yang bukan bagian dari setB . Ini memberi kita pelengkap relatif dari setB di setA :

2.5. Subset dan Superset

Subset hanyalah bagian dari set yang lebih besar, dan set yang lebih besar disebut superset. Saat kita memiliki subset dan superset, gabungan keduanya sama dengan superset, dan perpotongan sama dengan subset.

3. Mengimplementasikan Operasi Set Dengan java.util.Set

Untuk melihat bagaimana kita melakukan operasi himpunan di Java, kita akan mengambil contoh set dan mengimplementasikan perpotongan, gabungan dan pelengkap relatif. Jadi, mari kita mulai dengan membuat contoh kumpulan bilangan bulat:

private Set setA = setOf(1,2,3,4); private Set setB = setOf(2,4,6,8); private static Set setOf(Integer... values) { return new HashSet(Arrays.asList(values)); }

3.1. Persimpangan

Pertama, kita akan menggunakan metode retretAll untuk membuat perpotongan dari kumpulan sampel kita . Karena mempertahankanAll memodifikasi set secara langsung, kita akan membuat salinan setA yang disebut intersectSet. Kemudian kita akan menggunakan metode retretAll untuk mempertahankan nilai yang juga ada di setB :

Set intersectSet = new HashSet(setA); intersectSet.retainAll(setB); assertEquals(setOf(2,4), intersectSet);

3.2. Persatuan

Sekarang mari gunakan metode addAll untuk membuat gabungan kumpulan sampel kita . The addAll metode menambahkan semua anggota set yang disediakan untuk yang lain. Sekali lagi saat addAll memperbarui set secara langsung, kita akan membuat salinan setA yang disebut unionSet , dan kemudian menambahkan setB ke dalamnya:

Set unionSet = new HashSet(setA); unionSet.addAll(setB); assertEquals(setOf(1,2,3,4,6,8), unionSet);

3.3. Pelengkap Relatif

Terakhir, kita akan menggunakan metode removeAll untuk membuat pelengkap relatif dari setB di setA . Kita tahu bahwa kita menginginkan nilai yang ada di setA yang tidak ada di setB . Jadi kita hanya perlu menghapus Semua elemen dari setA yang juga ada di setB :

Set differenceSet = new HashSet(setA); differenceSet.removeAll(setB); assertEquals(setOf(1,3), differenceSet);

4. Pelaksana Set Operasi dengan Streaming s

4.1. Persimpangan

Mari buat perpotongan set kita menggunakan Streams .

First, we'll get the values from setA into a stream. Then we'll filter the stream to keep all values that are also in setB. And lastly, we'll collect the results into a new Set:

Set intersectSet = setA.stream() .filter(setB::contains) .collect(Collectors.toSet()); assertEquals(setOf(2,4), intersectSet);

4.2. Union

Now let's use the static method Streams.concat to add the values of our sets into a single stream.

In order to get the union from the concatenation of our sets, we need to remove any duplicates. We'll do this by simply collecting the results into a Set:

Set unionSet = Stream.concat(setA.stream(), setB.stream()) .collect(Collectors.toSet()); assertEquals(setOf(1,2,3,4,6,8), unionSet);

4.3. Relative Complement

Finally, we'll create the relative complement of setB in setA.

As we did with the intersection example we'll first get the values from setA into a stream. This time we'll filter the stream to remove any values that are also in setB. Then, we'll collect the results into a new Set:

Set differenceSet = setA.stream() .filter(val -> !setB.contains(val)) .collect(Collectors.toSet()); assertEquals(setOf(1,3), differenceSet);

5. Utility Libraries for Set Operations

Now that we've seen how to perform basic set operations with pure Java, let's use a couple of utility libraries to perform the same operations. One nice thing about using these libraries is that the method names clearly tell us what operation is being performed.

5.1. Dependencies

In order to use the Guava Sets and Apache Commons Collections SetUtils we need to add their dependencies:

 com.google.guava guava 27.1-jre   org.apache.commons commons-collections4 4.3 

5.2. Guava Sets

Let's use the Guava Sets class to perform intersection and union on our example sets. In order to do this we can simply use the static methods union and intersection of the Sets class:

Set intersectSet = Sets.intersection(setA, setB); assertEquals(setOf(2,4), intersectSet); Set unionSet = Sets.union(setA, setB); assertEquals(setOf(1,2,3,4,6,8), unionSet);

Take a look at our Guava Sets article to find out more.

5.3. Apache Commons Collections

Now let's use the intersection and union static methods of the SetUtils class from the Apache Commons Collections:

Set intersectSet = SetUtils.intersection(setA, setB); assertEquals(setOf(2,4), intersectSet); Set unionSet = SetUtils.union(setA, setB); assertEquals(setOf(1,2,3,4,6,8), unionSet);

Take a look at our Apache Commons Collections SetUtils tutorial to find out more.

6. Conclusion

Kami telah melihat ikhtisar tentang cara melakukan beberapa operasi dasar pada set, serta detail tentang cara mengimplementasikan operasi ini dalam sejumlah cara berbeda.

Semua contoh kode dapat ditemukan di GitHub.