Nastaviť operácie v Jave

1. Úvod

Sada je šikovný spôsob, ako predstavuje jedinečnú zbierku predmetov.

V tomto tutoriále sa dozvieme viac o tom, čo to znamená a ako ich môžeme použiť v Jave.

2. Trocha teórie množín

2.1. Čo je to sada?

Sada je jednoducho skupina jedinečných vecí. Takže významnou charakteristikou ktorejkoľvek sady je, že neobsahuje duplikáty.

Do sady môžeme vložiť čokoľvek, čo sa nám páči. Zvyčajne však používame množiny na zoskupovanie vecí, ktoré majú spoločnú vlastnosť. Mohli by sme mať napríklad súpravu vozidiel alebo súpravu zvierat.

Ako jednoduchý príklad použijeme dve sady celých čísel:

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

Sady môžeme zobraziť ako diagram jednoduchým vložením hodnôt do kruhov:

Takéto diagramy sú známe ako Vennove diagramy a poskytujú nám užitočný spôsob, ako ukázať interakcie medzi množinami, ako uvidíme neskôr.

2.2. Priesečník množín

Termín križovatka znamená spoločné hodnoty rôznych množín.

Vidíme, že celé čísla 2 a 4 existujú v obidvoch množinách. Priesečník množiny A a množiny B je teda 2 a 4, pretože to sú hodnoty, ktoré sú spoločné pre obe naše množiny.

setA križovatka setB = {2, 4}

Aby sme zobrazili priesečník v diagrame, spojíme naše dve množiny a zvýrazníme oblasť, ktorá je spoločná pre obe naše množiny:

2.3. Únia súprav

Termín únie znamená kombinovanie hodnôt rôznych množín.

Vytvorme teda novú množinu, ktorá je spojením našich vzorových množín. Už vieme, že v sade nemôžeme mať duplicitné hodnoty. Naše množiny však majú duplicitné hodnoty (2 a 4). Keď teda skombinujeme obsah oboch množín, musíme zabezpečiť, aby sme odstránili duplikáty. Takže nakoniec skončíme s 1, 2, 3, 4, 6 a 8.

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

Znovu môžeme ukázať spojenie v diagrame. Spojme teda naše dve množiny a zvýraznime oblasť, ktorá predstavuje úniu:

2.4. Relatívny doplnok množín

Termín relatívny doplnok znamená hodnoty z jednej množiny, ktoré nie sú v inej. Označuje sa tiež ako stanovený rozdiel.

Poďme teraz vytvoriť nové množiny, ktoré sú relatívnym doplnkom nastaviťA a setB.

relatívny doplnok množiny A v množine B = {6, 8} relatívny doplnok množiny B v množine A = {1, 3}

A teraz poďme zvýrazniť oblasť v nastaviťA to nie je súčasťou setB. To nám dáva relatívny doplnok setB v nastaviťA:

2.5. Podmnožina a nadmnožina

Podmnožina je jednoducho súčasťou väčšej množiny a väčšia množina sa nazýva nadmnožina. Keď máme podmnožinu a nadmnožinu, spojenie oboch sa rovná nadmnožine a priesečník sa rovná podmnožine.

3. Implementácia operácií množiny pomocou java.util.Set

Aby sme videli, ako vykonávame množinové operácie v Jave, vezmeme si ukážkové množiny a implementujeme priesečník, zjednotenie a relatívny doplnok. Začnime teda vytvorením našich vzorových množín celých čísel:

súkromná sada setA = setOf (1,2,3,4); súkromná sada setB = setOf (2,4,6,8); private static Set setOf (Integer ... values) {return new HashSet (Arrays.asList (values)); }

3.1. Križovatka

Najprv použijeme keepAll metóda do vytvorte priesečník našich vzorových množín. Pretože keepAll priamo upraví množinu, urobíme jej kópiu nastaviťA zavolal intersectSet. Potom použijeme keepAll metóda na udržanie hodnôt, ktoré sú tiež v setB:

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

3.2. Únie

Teraz použijeme pridať všetko metóda do vytvorte spojenie našich vzorových množín. The pridať všetko metóda pridá všetkých členov dodávanej sady k druhej. Opäť ako pridať všetko aktualizuje sadu priamo, urobíme kópiu súboru nastaviťA zavolal unionSeta potom pridajte setB k tomu:

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

3.3. Relatívny doplnok

Nakoniec použijeme odobrať všetky metóda do vytvoriť relatívny doplnok setB v nastaviťA. Vieme, že chceme hodnoty, ktoré sú v nich nastaviťA ktoré neexistujú v setB. Potrebujeme teda odstrániť všetky prvky z nastaviťA ktoré sú tiež v setB:

Nastaviť rozdielSet = nový HashSet (setA); differenceSet.removeAll (setB); assertEquals (setOf (1,3), differenceSet);

4. Implementácia operácií množiny s Prúds

4.1. Križovatka

Vytvorme priesečník našich množín pomocou Prúdy.

Najskôr dostaneme hodnoty z nastaviťA do potoka. Potom prefiltrujeme stream, aby sa zachovali všetky hodnoty, ktoré sú tiež v setB. A nakoniec zhromaždíme výsledky do nového Nastaviť:

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

4.2. Únie

Teraz použijeme statickú metódu Streams.concat aby sme spojili hodnoty našich množín do jednej Prúd.

Ak chcete získať spojenie zo zreťazenia našich množín, musíme odstrániť všetky duplikáty. Urobíme to tak, že výsledky jednoducho zhromaždíme do a Nastaviť:

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

4.3. Relatívny doplnok

Nakoniec vytvoríme relatívny doplnok setB v nastaviťA.

Rovnako ako v prípade príkladu križovatky, najskôr získame hodnoty z nastaviťA do potoka. Tentokrát prefiltrujeme stream, aby sme odstránili všetky hodnoty, ktoré sú tiež v setB. Potom zhromaždíme výsledky do nového Nastaviť:

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

5. Knižnice pomocných programov pre operácie množiny

Teraz, keď sme videli, ako vykonávať základné operácie s čistou Javou, použijeme na vykonanie tých istých operácií niekoľko pomocných knižníc. Jedna príjemná vec pri používaní týchto knižníc je, že názvy metód nám jasne hovoria, aká operácia sa vykonáva.

5.1. Závislosti

Aby bolo možné používať Guava Sady a zbierky Apache Commons SetUtils musíme pridať ich závislosti:

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

5.2. Sady guavy

Použime guavu Sady trieda vykonávať križovatka a únie na našich príkladoch. Na tento účel môžeme jednoducho použiť statické metódy únie a križovatka z Sady trieda:

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

Ak sa chcete dozvedieť viac, pozrite si náš článok Guava Sets.

5.3. Zbierky Apache Commons

Teraz použijeme križovatka a únie statické metódy SetUtils trieda zo zbierok Apache Commons:

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

Prezrite si naše zbierky Apache Commons SetUtils návod, aby ste sa dozvedeli viac.

6. Záver

Videli sme prehľad, ako vykonávať niektoré základné operácie na množinách, ako aj podrobnosti o tom, ako tieto operácie implementovať mnohými rôznymi spôsobmi.

Všetky príklady kódu nájdete na GitHub.


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