Stel bewerkingen in Java in

1. Inleiding

Een set is een handige manier om een ​​unieke verzameling items weer te geven.

In deze zelfstudie leren we meer over wat dat betekent en hoe we er een in Java kunnen gebruiken.

2. Een beetje vaste theorie

2.1. Wat is een set?

Een set is gewoon een groep unieke dingen. Zo, een belangrijk kenmerk van elke set is dat deze geen duplicaten bevat.

We kunnen alles wat we willen in een set stoppen. We gebruiken echter meestal sets om dingen te groeperen die een gemeenschappelijke eigenschap hebben. We zouden bijvoorbeeld een set voertuigen of een set dieren kunnen hebben.

Laten we twee sets gehele getallen gebruiken als een eenvoudig voorbeeld:

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

We kunnen sets als een diagram weergeven door de waarden eenvoudig in cirkels te plaatsen:

Dergelijke diagrammen staan ​​bekend als Venn-diagrammen en geven ons een handige manier om interacties tussen sets te laten zien, zoals we later zullen zien.

2.2. De kruising van sets

De voorwaarde kruispunt betekent de gemeenschappelijke waarden van verschillende sets.

We kunnen zien dat de gehele getallen 2 en 4 in beide sets voorkomen. Het snijpunt van setA en setB is dus 2 en 4 omdat dit de waarden zijn die gemeenschappelijk zijn voor onze beide sets.

setA kruising setB = {2, 4}

Om het snijpunt in een diagram te tonen, voegen we onze twee sets samen en markeren we het gebied dat gemeenschappelijk is voor onze beide sets:

2.3. The Union of Sets

De voorwaarde unie betekent het combineren van de waarden van verschillende sets.

Laten we dus een nieuwe set maken die de vereniging is van onze voorbeeldsets. We weten al dat we geen dubbele waarden in een set kunnen hebben. Onze sets hebben echter enkele dubbele waarden (2 en 4). Dus als we de inhoud van beide sets combineren, moeten we ervoor zorgen dat we duplicaten verwijderen. Dus we eindigen met 1, 2, 3, 4, 6 en 8.

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

Opnieuw kunnen we de unie in een diagram laten zien. Dus laten we onze twee sets samenvoegen en het gebied markeren dat de unie vertegenwoordigt:

2.4. De relatieve aanvulling van sets

De voorwaarde relatief complement betekent de waarden van de ene set die niet in een andere set staan. Het wordt ook wel het ingestelde verschil genoemd.

Laten we nu nieuwe sets maken die de relatieve complementen zijn van setA en setB.

relatief complement van setA in setB = {6, 8} relatief complement van setB in setA = {1, 3}

En laten we nu het gebied in setA dat is geen onderdeel van setB. Dit geeft ons het relatieve complement van setB in setA:

2.5. De subset en superset

Een subset is gewoon onderdeel van een grotere set en de grotere set wordt een superset genoemd. Als we een subset en superset hebben, is de vereniging van de twee gelijk aan de superset en is het snijpunt gelijk aan de subset.

3. Setbewerkingen implementeren met java.util.Set

Om te zien hoe we set-bewerkingen uitvoeren in Java, nemen we de voorbeeldsets en implementeren we het snijpunt, de unie en het relatieve complement. Dus laten we beginnen met het maken van onze voorbeeldsets van gehele getallen:

private Set setA = setOf (1,2,3,4); private Set setB = setOf (2,4,6,8); privé statische Set setOf (Integer ... waarden) {retourneer nieuwe HashSet (Arrays.asList (waarden)); }

3.1. Kruispunt

Ten eerste gaan we de keepAll methode om creëer de kruising van onze sample sets. Omdat keepAll wijzigt de set rechtstreeks, we maken er een kopie van setA gebeld intersectSet. Dan gebruiken we de keepAll methode om de waarden te behouden die ook in setB:

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

3.2. Unie

Laten we nu de Voeg alles toe methode om creëer de vereniging van onze sample sets. De Voeg alles toe methode voegt alle leden van de geleverde set toe aan de andere. Nogmaals als Voeg alles toe werkt de set rechtstreeks bij, we maken er een kopie van setA gebeld unionSet, en voeg dan toe setB naar het:

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

3.3. Relatieve aanvulling

Ten slotte gebruiken we de Verwijder alles methode om creëer het relatieve complement van setB in setA. We weten dat we de waarden willen die erin zitten setA die niet bestaan ​​in setB. We hoeven dus alleen alle elementen te verwijderen uit setA die ook in setB:

Set differentSet = nieuwe HashSet (setA); differentSet.removeAll (setB); assertEquals (setOf (1,3), differentieSet);

4. Implementeren van setbewerkingen met Strooms

4.1. Kruispunt

Laten we de kruising van onze sets maken met Streams.

Eerst halen we de waarden uit setA in een stroom. Vervolgens filteren we de stream om alle waarden te behouden die ook in setB. En als laatste verzamelen we de resultaten in een nieuw Set:

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

4.2. Unie

Laten we nu de statische methode gebruiken Streams.concat om de waarden van onze sets in één op te tellen stroom.

Om de unie uit de aaneenschakeling van onze sets te halen, moeten we eventuele duplicaten verwijderen. We doen dit door simpelweg de resultaten te verzamelen in een Set:

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

4.3. Relatieve aanvulling

Ten slotte maken we het relatieve complement van setB in setA.

Net als bij het voorbeeld van een kruispunt, krijgen we eerst de waarden van setA in een stroom. Deze keer filteren we de stream om alle waarden te verwijderen die ook in setB. Vervolgens verzamelen we de resultaten in een nieuw Set:

Stel differentieSet = setA.stream () .filter (val ->! SetB.contains (val)) .collect (Collectors.toSet ()); assertEquals (setOf (1,3), differentieSet);

5. Hulpprogramma's voor setbewerkingen

Nu we hebben gezien hoe basissetbewerkingen kunnen worden uitgevoerd met pure Java, laten we een aantal hulpprogramma-bibliotheken gebruiken om dezelfde bewerkingen uit te voeren. Een prettig aspect van het gebruik van deze bibliotheken is dat de namen van de methoden duidelijk aangeven welke bewerking wordt uitgevoerd.

5.1. Afhankelijkheden

Om de Guava te gebruiken Sets en Apache Commons-collecties SetUtils we moeten hun afhankelijkheden toevoegen:

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

5.2. Guava-sets

Laten we de Guava gebruiken Sets klasse om uit te voeren kruispunt en unie op onze voorbeeldsets. Om dit te doen, kunnen we eenvoudig de statische methoden gebruiken unie en kruispunt van de Sets klasse:

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);

Bekijk ons ​​artikel over Guavasets voor meer informatie.

5.3. Apache Commons-collecties

Laten we nu de kruispunt en unie statische methoden van de SetUtils klasse uit de Apache Commons-collecties:

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

Bekijk onze Apache Commons-collecties SetUtils tutorial voor meer informatie.

6. Conclusie

We hebben een overzicht gezien van hoe u enkele basisbewerkingen op sets kunt uitvoeren, evenals details over hoe u deze bewerkingen op een aantal verschillende manieren kunt implementeren.

Alle codevoorbeelden zijn te vinden op GitHub.