Postavite operacije u Javi

1. Uvod

Komplet je zgodan način predstavljanja jedinstvene kolekcije predmeta.

U ovom uputstvu naučit ćemo više o tome što to znači i kako ga možemo koristiti u Javi.

2. Malo teorije skupova

2.1. Što je set?

Skup je jednostavno skupina jedinstvenih stvari. Tako, značajna karakteristika bilo kojeg skupa je da ne sadrži duplikate.

U set možemo staviti sve što nam se sviđa. Međutim, obično koristimo skupove za grupiranje stvari koje imaju zajedničku osobinu. Na primjer, mogli bismo imati skup vozila ili skup životinja.

Koristimo dva skupa cijelih brojeva kao jednostavan primjer:

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

Skupove možemo prikazati kao dijagram jednostavnim stavljanjem vrijednosti u krugove:

Dijagrami poput ovih poznati su kao Vennovi dijagrami i pružaju nam koristan način za prikaz interakcija između skupova kao što ćemo vidjeti kasnije.

2.2. Sjecište skupova

Uvjet križanje znači zajedničke vrijednosti različitih skupova.

Možemo vidjeti da cijeli brojevi 2 i 4 postoje u oba skupa. Dakle, presjek skupa A i skupa B je 2 i 4, jer su to vrijednosti zajedničke za oba naša skupa.

setSjecište setB = {2, 4}

Kako bismo prikazali presjek u dijagramu, spajamo naša dva skupa i ističemo područje koje je zajedničko za oba naša skupa:

2.3. Unija skupova

Uvjet unija znači kombiniranje vrijednosti različitih skupova.

Pa kreirajmo novi skup koji je unija naših primjera. Već znamo da ne možemo imati duplicirane vrijednosti u skupu. Međutim, naši skupovi imaju neke ponovljene vrijednosti (2 i 4). Dakle, kada kombiniramo sadržaj oba skupa, moramo osigurati uklanjanje duplikata. Dakle, na kraju imamo 1, 2, 3, 4, 6 i 8.

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

Opet možemo prikazati uniju u dijagramu. Dakle, spojimo naša dva skupa i istaknimo područje koje predstavlja uniju:

2.4. Relativni komplement skupova

Uvjet relativna dopuna označava vrijednosti iz jednog skupa koje nisu u drugom. Naziva se i skupnom razlikom.

Ajmo sada stvoriti nove skupove koji su relativni komplementi setA i setB.

relativni komplement skupa A u skupu B = {6, 8} relativni komplement skupa B u skupu A = {1, 3}

A sada, istaknimo to područje u setA to nije dio setB. To nam daje relativni dodatak setB u setA:

2.5. Podskup i Superset

Podskup je jednostavno dio većeg skupa, a veći skup naziva se superskup. Kada imamo podskup i nadskup, unija toga dvoje jednaka je nadsvetu, a presjek je jednak na podskupinu.

3. Provedba skupnih operacija s java.util.Set

Da bismo vidjeli kako izvodimo operacije skupova na Javi, uzet ćemo primjere skupova i implementirati presjek, spoj i relativni komplement. Pa krenimo s izradom naših uzoraka skupova cijelih brojeva:

privatno Set setA = setOf (1,2,3,4); privatni Set setB = setOf (2,4,6,8); privatni statički set setOf (Integer ... values) {return new HashSet (Arrays.asList (values)); }

3.1. Križanje

Prvo ćemo koristiti zadržiSve metoda za stvoriti presjek naših skupova uzoraka. Jer zadržiSve izravno mijenja skup, napravit ćemo kopiju setA pozvao intersectSet. Tada ćemo koristiti zadržiSve metoda za zadržavanje vrijednosti koje su također u setB:

Postavi intersectSet = novi HashSet (setA); intersectSet.retainAll (setB); assertEquals (setOf (2,4), intersectSet);

3.2. Unija

Sada upotrijebimo Dodaj Sve metoda za stvoriti uniju naših uzoraka skupova. The Dodaj Sve metoda dodaje sve članove isporučenog skupa u drugi. Opet kao Dodaj Sve ažurira set izravno, napravit ćemo kopiju setA pozvao unionSet, a zatim dodajte setB tome:

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

3.3. Relativni dodatak

Napokon ćemo upotrijebiti ukloniti sve metoda za stvoriti relativni dodatak setB u setA. Znamo da želimo vrijednosti koje su u nama setA koji ne postoje u setB. Dakle, samo trebamo uklonitiSve elemente iz setA koji su također u setB:

Postavi razlikaSet = novi HashSet (setA); razlikaSet.removeAll (setB); assertEquals (setOf (1,3), razlikaSet);

4. Provedba skupnih operacija s Streams

4.1. Križanje

Stvorimo presjek naših skupova pomoću Potoci.

Prvo ćemo dobiti vrijednosti iz setA u potok. Zatim ćemo filtrirati tok da zadržimo sve vrijednosti koje su također u setB. I na kraju, prikupit ćemo rezultate u novi Postavi:

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

4.2. Unija

Koristimo sada statičku metodu Potoci.concat za dodavanje vrijednosti naših skupova u jedan potok.

Da bismo uniju dobili iz spajanja naših skupova, moramo ukloniti sve duplikate. To ćemo učiniti jednostavnim prikupljanjem rezultata u Postavi:

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

4.3. Relativni dodatak

Na kraju ćemo stvoriti relativni dodatak setB u setA.

Kao što smo učinili s primjerom presjeka, prvo ćemo dobiti vrijednosti iz setA u potok. Ovaj put ćemo filtrirati stream kako bismo uklonili sve vrijednosti koje se također nalaze setB. Zatim ćemo prikupiti rezultate u novi Postavi:

Postavi razlikaSet = setA.stream () .filter (val ->! SetB. sadrži (val)) .collect (Collectors.toSet ()); assertEquals (setOf (1,3), razlikaSet);

5. Uslužne knjižnice za postavljene operacije

Sad kad smo vidjeli kako izvoditi osnovne operacije skupa s čistom Javom, iskoristimo nekoliko pomoćnih knjižnica za izvođenje istih operacija. Jedna lijepa stvar kod korištenja ovih knjižnica je ta što nam nazivi metoda jasno govore koja se operacija izvodi.

5.1. Ovisnosti

Da bi se koristio Guava Kompleti i zbirke Apache Commons SetUtils trebamo dodati njihove ovisnosti:

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

5.2. Setovi Guava

Iskoristimo Guavu Kompleti razred za izvođenje križanje i unija na našim primjerima. Da bismo to učinili, možemo jednostavno koristiti statičke metode unija i križanje od Kompleti razred:

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

Da biste saznali više, pogledajte naš članak o garnituri Guava.

5.3. Zbirke Apache Commons

Sada upotrijebimo križanje i unija statičke metode SetUtils razred iz zbirke Apache Commons:

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

Pogledajte naše zbirke Apache Commons SetUtils udžbenik kako biste saznali više.

6. Zaključak

Vidjeli smo pregled načina izvođenja nekih osnovnih operacija na skupovima, kao i detalje o tome kako te operacije implementirati na više različitih načina.

Svi primjeri koda mogu se naći na GitHubu.