Műveletek beállítása Java-ban

1. Bemutatkozás

A készlet praktikus módja az egyedi tárgygyűjtemény képviseletének.

Ebben az oktatóanyagban többet megtudhatunk arról, hogy ez mit jelent, és hogyan használhatjuk egyet a Java-ban.

2. Egy kis halmazelmélet

2.1. Mi a készlet?

A készlet egyszerűen egyedi dolgok csoportja. Így, egyik halmaz egyik lényeges jellemzője, hogy nem tartalmaz duplikátumot.

Bármit beletehetünk egy készletbe. Azonban általában készleteket használunk olyan dolgok csoportosítására, amelyeknek közös vonásuk van. Például rendelkezhetünk járművekkel vagy állatokkal.

Használjunk két egész számkészletet egyszerű példaként:

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

A halmazokat diagramként jeleníthetjük meg, egyszerűen az értékeket körökbe rakva:

Az ilyen diagramok Venn-diagramok néven ismertek, és hasznos módszert kínálnak a halmazok közötti interakciók bemutatására, amint később láthatjuk.

2.2. A halmazok metszéspontja

A kifejezés útkereszteződés a különböző halmazok közös értékeit jelenti.

Láthatjuk, hogy a 2 és 4 egész szám mindkét halmazban létezik. Tehát a setA és a setB metszéspontja 2 és 4, mert ezek az értékek közösek mindkét halmazunkban.

setA kereszteződés setB = {2, 4}

Annak érdekében, hogy a metszéspontot diagramban jelenítsük meg, egyesítjük két halmazunkat, és kiemeljük azt a területet, amely mindkét halmazunkon közös:

2.3. A Halmazok Uniója

A kifejezés unió a különböző halmazok értékeinek kombinálását jelenti.

Tehát hozzunk létre egy új halmazt, amely a példakészleteink egyesítése. Már tudjuk, hogy nem lehetnek duplikált értékek egy halmazban. Készleteinknek azonban vannak párhuzamos értékei (2 és 4). Tehát, amikor egyesítjük mindkét készlet tartalmát, biztosítanunk kell az ismétlődések eltávolítását. Tehát 1, 2, 3, 4, 6 és 8 lesz a vége.

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

Ismét ábrán mutatjuk be az uniót. Tehát egyesítsük két halmazunkat, és emeljük ki az uniót képviselő területet:

2.4. A halmazok relatív kiegészítése

A kifejezés relatív kiegészítés azt jelenti, hogy az egyik halmaz értéke nem egy másik. Megállapított különbségként is emlegetik.

Most hozzunk létre új halmazokat, amelyek a relatív kiegészítései setA és setB.

a halmaz relatív komplementere a halmazban = {6, 8} a halmaz relatív kiegészítése a halmazban = {1, 3}

És most emeljük ki a területet setA ez nem része setB. Ez megadja nekünk a setB ban ben setA:

2.5. Az Alhalmaz és a Szuperhalmaz

Egy részhalmaz egyszerűen egy nagyobb halmaz része, és a nagyobb halmazt szuperhalmaznak nevezzük. Ha van részhalmazunk és szuperhalmazunk, akkor a kettő egyesülése egyenlő a szuperhalmazzal, a metszéspont pedig megegyezik a részhalmazzal.

3. Beállított műveletek végrehajtása a java.util.Set

Annak érdekében, hogy lássuk, hogyan hajtjuk végre a halmaz műveleteket a Java-ban, vesszük a példa halmazokat, és végrehajtjuk a metszéspontot, az egyesítést és a relatív kiegészítést. Tehát kezdjük azzal, hogy létrehozzuk az egész számmintákat:

privát Set setA = setOf (1,2,3,4); privát halmazB = setOf (2,4,6,8); privát statikus Set setOf (Egész szám ... értékek) {return new HashSet (Arrays.asList (values)); }

3.1. Útkereszteződés

Először a retainAll módszer a hozza létre a mintakészleteink metszéspontját. Mivel retainAll közvetlenül módosítja a készletet, készítünk róla egy másolatot setA hívott intersectSet. Akkor használjuk a retainAll módszer a szintén benne lévő értékek megtartására setB:

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

3.2. Unió

Most használjuk a az összes hozzáadása módszer a hozza létre a mintakészleteink unióját. A az összes hozzáadása A metódus hozzáadja a szállított készlet összes tagját a másikhoz. Ismét mint az összes hozzáadása közvetlenül frissíti a készletet, készítünk róla egy másolatot setA hívott unionSet, majd adja hozzá setB hozzá:

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

3.3. Relatív kiegészítés

Végül használjuk a összes eltávolítása módszer a létrehozza a relatív kiegészítését setB ban ben setA. Tudjuk, hogy szeretnénk azokat az értékeket, amelyekben benne vannak setA amelyek nem léteznek setB. Tehát csak el kell távolítanunk minden elemet a setA amelyek szintén vannak setB:

Set differSet = új HashSet (setA); különbségSet.removeAll (setB); assertEquals (setOf (1,3), különbségSet);

4. Készlet műveletek végrehajtása a Folyams

4.1. Útkereszteződés

Készítsük el halmazaink metszéspontját a segítségével Patakok.

Először is megkapjuk az értékeket setA patakba. Ezután szűrjük a folyamot, hogy megmaradjon az összes érték, amely szintén benne van setB. Végül pedig összegyűjtjük az eredményeket egy újba Készlet:

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

4.2. Unió

Most használjuk a statikus módszert Patakok.concat halmazaink értékeinek egyetlen összeadása folyam.

Annak érdekében, hogy az unió a készleteink összefűzéséből származzon, el kell távolítanunk minden másolatot. Ezt úgy tesszük meg, hogy egyszerűen összegyűjtjük az eredményeket a Készlet:

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

4.3. Relatív kiegészítés

Végül létrehozzuk a setB ban ben setA.

Ahogy a metszéspéldával tettük, először az értékeket fogjuk megkapni setA patakba. Ezúttal szűrjük a folyamot, hogy eltávolítsuk a benne lévő értékeket setB. Ezután összegyűjtjük az eredményeket egy újba Készlet:

Set differSet = setA.stream () .filter (val ->! SetB.contains (val)) .collect (Collectors.toSet ()); assertEquals (setOf (1,3), különbségSet);

5. Segédkönyvtárak a meghatározott műveletekhez

Most, hogy láttuk, hogyan lehet az alapkészlet műveleteket végrehajtani tiszta Java-val, használjunk pár segédkönyvtárat ugyanazok a műveletek végrehajtására. A könyvtárak használatának egyik szép vonása, hogy a metódusnevek világosan megmondják, hogy milyen műveletet végeznek.

5.1. Függőségek

A Guava használata érdekében Készletek és az Apache Commons gyűjtemények SetUtils hozzá kell adnunk a függőségüket:

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

5.2. Guava szett

Használjuk a guavát Készletek osztály előadni útkereszteződés és unió példakészleteinken. Ennek érdekében egyszerűen használhatjuk a statikus módszereket unió és útkereszteződés a Készletek osztály:

Set intersectSet = Beállítja.intersection (setA, setB); assertEquals (setOf (2,4), intersectSet); Set unionSet = Beállít.union (setA, setB); assertEquals (setOf (1,2,3,4,6,8), unionSet);

További információért tekintse meg a Guava szett cikkünket.

5.3. Apache Commons Gyűjtemények

Most használjuk a útkereszteződés és unió statikus módszerei SetUtils osztály az Apache Commons gyűjteményekből:

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

Vessen egy pillantást Apache Commons gyűjteményeinkre SetUtils bemutató további információkért.

6. Következtetés

Láttunk egy áttekintést arról, hogyan lehet néhány alapvető műveletet végrehajtani a készleteken, valamint részleteket arról, hogyan lehet ezeket a műveleteket különböző módon végrehajtani.

Az összes kódpélda megtalálható a GitHub oldalon.