Tetapkan Operasi di Java

1. Pengenalan

Satu set adalah cara yang berguna untuk mewakili koleksi item yang unik.

Dalam tutorial ini, kita akan mengetahui lebih lanjut tentang apa maksudnya dan bagaimana kita dapat menggunakannya di Java.

2. Sedikit Teori Set

2.1. Apa itu Set?

Satu set hanyalah sekumpulan perkara yang unik. Oleh itu, ciri penting dari mana-mana kumpulan adalah bahawa ia tidak mengandungi pendua .

Kita boleh memasukkan apa sahaja yang kita suka ke dalam satu set. Walau bagaimanapun, kami biasanya menggunakan set untuk mengumpulkan sesuatu yang mempunyai sifat yang sama. Sebagai contoh, kita dapat memiliki satu set kenderaan atau satu set binatang.

Mari gunakan dua set bilangan bulat sebagai contoh mudah:

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

Kita dapat menunjukkan set sebagai rajah dengan hanya memasukkan nilai ke dalam bulatan:

Gambar rajah seperti ini dikenali sebagai gambar rajah Venn dan memberi kita kaedah yang berguna untuk menunjukkan interaksi antara set seperti yang akan kita lihat kemudian.

2.2. Persimpangan Set

Istilah persimpangan bermaksud nilai sepunya bagi set yang berbeza .

Kita dapat melihat bahawa bilangan bulat 2 dan 4 wujud dalam kedua-dua set. Jadi persimpangan setA dan setB adalah 2 dan 4 kerana ini adalah nilai-nilai yang biasa bagi kedua-dua set kami.

setA intersection setB = {2, 4}

Untuk menunjukkan persimpangan dalam rajah, kami menggabungkan dua set kami dan menyoroti kawasan yang biasa untuk kedua-dua set kami:

2.3. Kesatuan Set

Istilah penyatuan bermaksud menggabungkan nilai-nilai set yang berbeza .

Oleh itu, mari kita buat satu set baru yang merupakan penyatuan set contoh kita. Kita sudah tahu bahawa kita tidak boleh mempunyai nilai pendua dalam satu set. Walau bagaimanapun, set kami mempunyai beberapa nilai pendua (2 dan 4). Oleh itu, apabila kita menggabungkan kandungan kedua-dua set, kita perlu memastikan bahawa kita membuang pendua. Oleh itu, kita berakhir dengan 1, 2, 3, 4, 6 dan 8.

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

Sekali lagi kita dapat menunjukkan kesatuan dalam rajah. Oleh itu, mari gabungkan dua set kami dan serlahkan kawasan yang mewakili kesatuan:

2.4. Pelengkap Set Relatif

Istilah pelengkap relatif bermaksud nilai dari satu set yang tidak ada pada satu set yang lain . Ia juga disebut sebagai perbezaan 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 soroti kawasan di setA yang bukan sebahagian daripada setB . Ini memberi kita pelengkap relatif setB dalam setA :

2.5. Subset dan Superset

Subset hanyalah sebahagian daripada set yang lebih besar, dan set yang lebih besar disebut superset. Apabila kita mempunyai subset dan superset, penyatuan keduanya sama dengan superset, dan persimpangan sama dengan subset.

3. Melaksanakan Operasi Set Dengan java.util.Set

Untuk melihat bagaimana kami melakukan operasi set di Java, kami akan mengambil contoh set dan melaksanakan persimpangan, penyatuan dan pelengkap relatif. Oleh itu, mari mulakan dengan membuat set bilangan bulat kami:

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 kaedah retainAll untuk membuat persimpangan set sampel kita . Kerana retainAll mengubah set secara langsung, kami akan membuat salinan setA yang disebut intersectSet. Kemudian kita akan menggunakan kaedah retainAll untuk menyimpan nilai-nilai yang juga ada di setB :

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

3.2. Kesatuan

Sekarang mari kita gunakan kaedah addAll untuk membuat penyatuan set sampel kami . The addAll kaedah menambah semua ahli set yang dibekalkan kepada yang lain. Sekali lagi sebagai addAll mengemas kini set secara langsung, kami akan membuat salinan setA yang disebut UnionSet , dan kemudian menambahkan setB padanya:

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

3.3. Pelengkap Relatif

Akhirnya, kami akan menggunakan kaedah removeAll untuk membuat pelengkap relatif setB dalam setA . Kami tahu bahawa kami mahukan nilai-nilai yang ada di setA yang tidak ada di setB . Oleh itu, kita hanya perlu membuang semua elemen dari setA yang juga ada di setB :

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

4. Melaksanakan Operasi Set dengan Stream s

4.1. Persimpangan

Mari buat persimpangan set kami menggunakan Aliran .

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 gambaran umum mengenai bagaimana menjalankan beberapa operasi asas pada set, serta perincian tentang bagaimana melaksanakan operasi ini dengan beberapa cara yang berbeza.

Semua contoh kod boleh didapati di GitHub.