Indstil operationer i Java

1. Introduktion

Et sæt er en praktisk måde at repræsentere en unik samling af genstande på.

I denne vejledning lærer vi mere om, hvad det betyder, og hvordan vi kan bruge en i Java.

2. En smule sætteori

2.1. Hvad er et sæt?

Et sæt er simpelthen en gruppe unikke ting. Så, et væsentligt kendetegn ved ethvert sæt er, at det ikke indeholder duplikater.

Vi kan sætte alt, hvad vi kan lide, i et sæt. Imidlertid bruger vi typisk sæt til at gruppere ting, der har et fælles træk. For eksempel kunne vi have et sæt køretøjer eller et sæt dyr.

Lad os bruge to sæt heltal som et simpelt eksempel:

sætA: {1, 2, 3, 4} sætB: {2, 4, 6, 8}

Vi kan vise sæt som et diagram ved blot at sætte værdierne i cirkler:

Diagrammer som disse er kendt som Venn-diagrammer og giver os en nyttig måde at vise interaktioner mellem sæt som vi vil se senere.

2.2. Skæringspunktet mellem sæt

Begrebet vejkryds betyder de fælles værdier for forskellige sæt.

Vi kan se, at heltalene 2 og 4 findes i begge sæt. Så krydset mellem setA og setB er 2 og 4, fordi det er de værdier, der er fælles for begge vores sæt.

setA kryds sæt B = {2, 4}

For at vise krydset i et diagram fletter vi vores to sæt sammen og fremhæver det område, der er fælles for begge vores sæt:

2.3. Unionen af ​​sæt

Begrebet Union betyder at kombinere værdierne for forskellige sæt.

Så lad os oprette et nyt sæt, der er foreningen af ​​vores eksempler. Vi ved allerede, at vi ikke kan have duplikatværdier i et sæt. Imidlertid har vores sæt nogle duplikatværdier (2 og 4). Så når vi kombinerer indholdet af begge sæt, er vi nødt til at sikre, at vi fjerner dubletter. Så vi ender med 1, 2, 3, 4, 6 og 8.

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

Igen kan vi vise foreningen i et diagram. Så lad os flette vores to sæt og fremhæve det område, der repræsenterer fagforeningen:

2.4. Den relative komplement af sæt

Begrebet relativ komplement betyder værdierne fra et sæt, der ikke er i et andet. Det kaldes også den indstillede forskel.

Lad os nu oprette nye sæt, der er de relative supplerer af sætA og sætB.

relativ komplement af setA i setB = {6, 8} relativ komplement af setB i setA = {1, 3}

Og nu, lad os fremhæve området i sætA det er ikke en del af sætB. Dette giver os det relative supplement til sætB i sætA:

2.5. Delsættet og supersættet

Et delsæt er simpelthen en del af et større sæt, og det større sæt kaldes et supersæt. Når vi har en delmængde og supersæt, er foreningen af ​​de to lig med supersættet, og skæringspunktet er lig med delmængden.

3. Implementering af sætoperationer med java.util.Set

For at se hvordan vi udfører sætoperationer i Java, tager vi eksempelsættene og implementerer krydset, unionen og det relative komplement. Så lad os starte med at oprette vores prøvesæt med heltal:

privat sæt sætA = setOf (1,2,3,4); privat sæt sætB = setOf (2,4,6,8); privat statisk sæt setOf (heltal ... værdier) {returner nyt HashSet (Arrays.asList (værdier)); }

3.1. Vejkryds

Først skal vi bruge bevar alle metode til oprette krydset mellem vores prøvesæt. Fordi bevar alle ændrer sættet direkte, vi laver en kopi af sætA hedder intersectSet. Så bruger vi bevar alle metode til at holde de værdier, der også er i sætB:

Indstil intersectSet = ny HashSet (setA); intersectSet.retainAll (setB); assertEquals (setOf (2,4), intersectSet);

3.2. Union

Lad os nu bruge tilføjAlle metode til oprette foreningen af ​​vores prøvesæt. Det tilføjAlle metoden tilføjer alle medlemmerne af det medfølgende sæt til det andet. Igen som tilføjAlle opdaterer sættet direkte, vi laver en kopi af sætA hedder unionSet, og tilføj derefter sætB til det:

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

3.3. Relativt supplement

Endelig bruger vi Fjern alt metode til skabe det relative supplement til sætB i sætA. Vi ved, at vi vil have de værdier, der er i sætA der ikke findes i sætB. Så vi skal bare fjerne alle elementer fra sætA der også er i sætB:

Indstil differenceSet = nyt HashSet (setA); differenceSet.removeAll (setB); assertEquals (setOf (1,3), differenceSet);

4. Implementering af sætoperationer med Strøms

4.1. Vejkryds

Lad os oprette krydset mellem vores sæt ved hjælp af Strømme.

Først får vi værdierne fra sætA ind i en strøm. Derefter filtrerer vi strømmen for at beholde alle værdier, der også er i sætB. Og endelig samler vi resultaterne i et nyt Sæt:

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

4.2. Union

Lad os nu bruge den statiske metode Streams.concat for at tilføje værdierne for vores sæt til en enkelt strøm.

For at få foreningen fra sammenkædningen af ​​vores sæt er vi nødt til at fjerne eventuelle duplikater. Vi gør dette ved blot at samle resultaterne i en Sæt:

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

4.3. Relativt supplement

Endelig opretter vi det relative supplement til sætB i sætA.

Som vi gjorde med krydseksemplet, får vi først værdierne fra sætA ind i en strøm. Denne gang filtrerer vi strømmen for at fjerne eventuelle værdier, der også er i sætB. Derefter samler vi resultaterne ind i et nyt Sæt:

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

5. Hjælpebiblioteker til sætoperationer

Nu hvor vi har set, hvordan man udfører grundlæggende sætoperationer med ren Java, lad os bruge et par hjælpebiblioteker til at udføre de samme operationer. En god ting ved at bruge disse biblioteker er, at metodens navne tydeligt fortæller os, hvilken operation der udføres.

5.1. Afhængigheder

For at bruge Guava Sæt og Apache Commons samlinger SetUtils vi er nødt til at tilføje deres afhængigheder:

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

5.2. Guava sæt

Lad os bruge Guava Sæt klasse at udføre vejkryds og Union på vores eksempler. For at gøre dette kan vi blot bruge de statiske metoder Union og vejkryds af Sæt 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);

Se vores artikel om Guava Sets for at finde ud af mere.

5.3. Apache Commons samlinger

Lad os nu bruge vejkryds og Union statiske metoder til SetUtils klasse fra Apache Commons Collections:

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

Se vores Apache Commons-samlinger SetUtils tutorial for at finde ud af mere.

6. Konklusion

Vi har set en oversigt over, hvordan man udfører nogle grundlæggende operationer på sæt, samt detaljer om, hvordan man implementerer disse operationer på en række forskellige måder.

Alle kodeeksemplerne kan findes på GitHub.