Festlegen von Operationen in Java

1. Einleitung

Ein Set ist eine praktische Möglichkeit, eine einzigartige Sammlung von Gegenständen darzustellen.

In diesem Tutorial erfahren Sie mehr darüber, was dies bedeutet und wie wir eines in Java verwenden können.

2. Ein bisschen Mengenlehre

2.1. Was ist ein Set?

Ein Set ist einfach eine Gruppe einzigartiger Dinge. Also, ein wesentliches Merkmal jeder Satz ist , dass es keine Duplikate enthält .

Wir können alles, was wir wollen, in ein Set packen. Normalerweise verwenden wir jedoch Mengen, um Dinge zu gruppieren, die ein gemeinsames Merkmal haben. Zum Beispiel könnten wir eine Reihe von Fahrzeugen oder eine Reihe von Tieren haben.

Verwenden wir als einfaches Beispiel zwei Sätze von ganzen Zahlen:

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

Wir können Mengen als Diagramm anzeigen, indem wir die Werte einfach in Kreise setzen:

Diagramme wie diese werden als Venn-Diagramme bezeichnet und bieten eine nützliche Möglichkeit, Interaktionen zwischen Mengen zu zeigen, wie wir später sehen werden.

2.2. Der Schnittpunkt von Mengen

Der Begriff Schnittpunkt bezeichnet die gemeinsamen Werte verschiedener Mengen .

Wir können sehen, dass die ganzen Zahlen 2 und 4 in beiden Mengen existieren. Der Schnittpunkt von setA und setB ist also 2 und 4, da dies die Werte sind, die unseren beiden Mengen gemeinsam sind.

setA intersection setB = {2, 4}

Um den Schnittpunkt in einem Diagramm darzustellen, führen wir unsere beiden Mengen zusammen und markieren den Bereich, der unseren beiden Mengen gemeinsam ist:

2.3. Die Union der Mengen

Der Begriff Vereinigung bedeutet das Kombinieren der Werte verschiedener Mengen .

Erstellen wir also eine neue Menge, die die Vereinigung unserer Beispielmengen darstellt. Wir wissen bereits, dass wir keine doppelten Werte in einer Menge haben können. Unsere Sets haben jedoch einige doppelte Werte (2 und 4). Wenn wir also den Inhalt beider Sätze kombinieren, müssen wir sicherstellen, dass Duplikate entfernt werden. Wir haben also 1, 2, 3, 4, 6 und 8.

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

Wieder können wir die Vereinigung in einem Diagramm zeigen. Lassen Sie uns also unsere beiden Sätze zusammenführen und den Bereich hervorheben, der die Union darstellt:

2.4. Die relative Ergänzung von Mengen

Der Begriff relatives Komplement bezeichnet die Werte aus einer Menge, die sich nicht in einer anderen befinden . Es wird auch als eingestellte Differenz bezeichnet.

Jetzt erstellen wir neue Mengen, die die relativen Ergänzungen von setA und setB sind .

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

Und jetzt markieren wir den Bereich in setA , der nicht Teil von setB ist . Dies gibt uns das relative Komplement von setB in setA :

2.5. Die Teilmenge und Obermenge

Eine Teilmenge ist einfach Teil einer größeren Menge, und die größere Menge wird als Obermenge bezeichnet. Wenn wir eine Teilmenge und eine Obermenge haben, ist die Vereinigung der beiden gleich der Obermenge, und der Schnittpunkt ist gleich der Teilmenge.

3. Implementieren von Set-Operationen mit java.util.Set

Um zu sehen, wie wir Mengenoperationen in Java ausführen, nehmen wir die Beispielmengen und implementieren die Schnittmenge, Vereinigung und relative Ergänzung. Beginnen wir also mit der Erstellung unserer Beispielsätze von ganzen Zahlen:

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. Überschneidung

Zuerst verwenden wir die RetainAll- Methode, um den Schnittpunkt unserer Beispielsätze zu erstellen . Da keepAll die Menge direkt ändert, erstellen wir eine Kopie von setA mit dem Namen intersectSet. Dann verwenden wir die RetainAll- Methode, um die Werte beizubehalten , die sich auch in setB befinden :

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

3.2. Union

Verwenden wir nun die addAll- Methode, um die Vereinigung unserer Beispielsätze zu erstellen . Die addAll- Methode fügt alle Mitglieder des bereitgestellten Satzes dem anderen hinzu. Wieder als addAll das Set direkt aktualisiert, werden wir eine Kopie machen setA genannt unionSet , und fügen Sie dann setb es:

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

3.3. Relative Ergänzung

Finally, we'll use the removeAll method to create the relative complement of setB in setA. We know that we want the values that are in setA that don't exist in setB. So we just need to removeAll elements from setA that are also in setB:

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

4. Implementing Set Operations with Streams

4.1. Intersection

Let's create the intersection of our sets using 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

Wir haben eine Übersicht über die Ausführung einiger grundlegender Operationen an Sets sowie Einzelheiten zur Implementierung dieser Operationen auf verschiedene Arten erhalten.

Alle Codebeispiele finden Sie auf GitHub.