Angi operasjoner i Java

1. Introduksjon

Et sett er en praktisk måte å representere en unik samling av ting på.

I denne opplæringen lærer vi mer om hva det betyr og hvordan vi kan bruke en i Java.

2. Litt settteori

2.1. Hva er et sett?

Et sett er rett og slett en gruppe unike ting. Så, et viktig trekk ved ethvert sett er at det ikke inneholder duplikater.

Vi kan sette alt vi liker i et sett. Imidlertid bruker vi vanligvis sett for å gruppere sammen ting som har et felles trekk. For eksempel kan vi ha et sett med kjøretøy eller et sett med dyr.

La oss bruke to sett med heltall som et enkelt eksempel:

settA: {1, 2, 3, 4} settB: {2, 4, 6, 8}

Vi kan vise sett som et diagram ved å bare sette verdiene i sirkler:

Diagrammer som disse er kjent som Venn-diagrammer og gir oss en nyttig måte å vise interaksjoner mellom settene som vi vil se senere.

2.2. Krysset av sett

Begrepet kryss betyr de vanlige verdiene til forskjellige sett.

Vi kan se at heltallene 2 og 4 eksisterer i begge settene. Så skjæringspunktet mellom settA og settB er 2 og 4 fordi dette er verdiene som er felles for begge settene våre.

settA kryss sett B = {2, 4}

For å vise skjæringspunktet i et diagram slår vi sammen våre to sett og markerer området som er felles for begge settene våre:

2.3. Union of Sets

Begrepet fagforening betyr å kombinere verdiene til forskjellige sett.

Så la oss lage et nytt sett som er foreningen av eksemplene våre. Vi vet allerede at vi ikke kan ha dupliserte verdier i et sett. Imidlertid har settene våre noen dupliserte verdier (2 og 4). Så når vi kombinerer innholdet i begge settene, må vi sørge for at vi fjerner duplikater. Så vi ender med 1, 2, 3, 4, 6 og 8.

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

Igjen kan vi vise foreningen i et diagram. Så la oss slå sammen våre to sett og markere området som representerer unionen:

2.4. Den relative komplement av sett

Begrepet relativt komplement betyr verdiene fra ett sett som ikke er i et annet. Det blir også referert til som settforskjellen.

La oss nå lage nye sett som er de relative komplementene til settA og settB.

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

Og nå, la oss markere området i settA det er ikke en del av settB. Dette gir oss det relative komplementet til settB i settA:

2.5. Delsettet og supersett

Et delsett er rett og slett en del av et større sett, og det større settet kalles et supersett. Når vi har en delmengde og overmengde, er foreningen av de to lik overmengden, og skjæringspunktet er lik delmengden.

3. Implementere settoperasjoner med java.util.Sett

For å se hvordan vi utfører settoperasjoner i Java, tar vi eksempelsettene og implementerer skjæringspunktet, unionen og det relative komplementet. Så la oss starte med å lage våre eksempler med heltall:

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. Kryss

Først skal vi bruke beholder alt metode til lage skjæringspunktet mellom prøvesettene våre. Fordi beholde alle endrer settet direkte, vi lager en kopi av settA kalt kryssSett. Så bruker vi beholder alt metode for å beholde verdiene som også er i settB:

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

3.2. Union

La oss nå bruke Legg til alle metode til lage foreningen av prøvesettene våre. De Legg til alle metoden legger til alle medlemmene i det medfølgende settet til det andre. Igjen som Legg til alle oppdaterer settet direkte, vi lager en kopi av settA kalt unionSett, og legg deretter til settB til det:

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

3.3. Relativ komplement

Til slutt bruker vi Fjern alle metode til skape det relative komplementet til settB i settA. Vi vet at vi vil ha verdiene som er i settA som ikke eksisterer i settB. Så vi trenger bare å fjerne alle elementene fra settA som også er i settB:

Sett differensSett = nytt HashSet (setA); differenceSet.removeAll (setB); assertEquals (setOf (1,3), differenceSet);

4. Implementere settoperasjoner med Strøms

4.1. Kryss

La oss lage skjæringspunktet mellom settene våre ved hjelp av Strømmer.

Først får vi verdiene fra settA inn i en strøm. Deretter filtrerer vi strømmen for å beholde alle verdiene som også er i settB. Og til slutt vil vi samle resultatene til en ny Sett:

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

4.2. Union

La oss nå bruke den statiske metoden Streams.concat for å legge til verdiene til settene våre til en enkelt strøm.

For å få foreningen fra sammenkoblingen av settene våre, må vi fjerne eventuelle duplikater. Vi gjør dette ved å bare samle resultatene i en Sett:

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

4.3. Relativ komplement

Til slutt lager vi det relative komplementet til settB i settA.

Som vi gjorde med krysseksemplet, får vi først verdiene fra settA inn i en strøm. Denne gangen filtrerer vi strømmen for å fjerne eventuelle verdier som også er i settB. Deretter samler vi resultatene til et nytt Sett:

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

5. Utility Libraries for Set Operations

Nå som vi har sett hvordan vi kan utføre grunnleggende settoperasjoner med ren Java, la oss bruke et par verktøybiblioteker for å utføre de samme operasjonene. En fin ting med å bruke disse bibliotekene er at metodenavnene tydelig forteller oss hvilken operasjon som utføres.

5.1. Avhengigheter

For å bruke Guava Settene og Apache Commons Collections SetUtils vi må legge til deres avhengighet:

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

5.2. Guava sett

La oss bruke Guava Settene klasse å utføre kryss og fagforening på eksemplene våre. For å gjøre dette kan vi ganske enkelt bruke de statiske metodene fagforening og kryss av Settene klasse:

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

Ta en titt på Guava Sets-artikkelen for å finne ut mer.

5.3. Apache Commons samlinger

La oss nå bruke kryss og fagforening statiske metoder for SetUtils klasse fra Apache Commons Collections:

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

Ta en titt på Apache Commons-samlingene SetUtils opplæring for å finne ut mer.

6. Konklusjon

Vi har sett en oversikt over hvordan du utfører noen grunnleggende operasjoner på sett, samt detaljer om hvordan du implementerer disse operasjonene på en rekke forskjellige måter.

Alle kodeeksemplene finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found