Metszés két egész tömb között

1. Áttekintés

Ebben a gyors bemutatóban megnézzük, hogyan kell számítsa ki a két egész szám metszéspontját „A” és „B”.

Arra is összpontosítunk, hogy miként kezeljük az ismétlődő bejegyzéseket.

A megvalósításhoz felhasználjuk Patakok.

2. Tagsági predikátum egy tömbhöz

Két halmaz metszéspontja definíció szerint egy halmaz, amelynek az összes értéke egy, amely szintén része a második halmaznak.

Ezért szükségünk van a Funkció vagy inkább a Állítmány hogy döntsön a tagságról a második tömbben. Mivel Lista ilyen módszert biztosít a dobozból, ezt átalakítjuk a-vé Lista:

Az predikátum isContainedInB = Arrays.asList (b) :: tartalmaz; 

3. A kereszteződés megépítése

A kapott tömb összeállításához fontolóra vesszük az első halmaz elemeit, és ellenőrizzük, hogy a második tömbben is szerepelnek-e.Ezután létrehozunk egy új tömböt ennek alapján.

A Folyam Az API biztosítja a szükséges módszereket. Először létrehozunk egy Folyam, majd szűrje a tagsággal-Állítmány végül létrehozunk egy új tömböt:

public static Integer [] intersectionSimple (Integer [] a, Integer [] b) {return Stream.of (a) .filter (Arrays.asList (b) :: tartalmaz) .toArray (Integer [] :: new); }

4. Ismétlődő bejegyzések

Mivel a Java tömbök nem Készlet megvalósításakor szembesülünk az ismétlődő bejegyzések kérdésével a bemenetben, majd az eredményben. Figyelje meg, hogy az eredmény előfordulásainak száma az első paraméterben előforduló eseményektől függ.

De halmazok esetén az elemek nem fordulhatnak elő többször. Archiválhatjuk ezt a különböző() módszer:

public static Integer [] intersectionSet (Integer [] a, Integer [] b) {return Stream.of (a) .filter (Arrays.asList (b) :: tartalmaz) .distinct () .toArray (Integer [] :: új); }

Tehát a kereszteződés hossza már nem függ a paraméterek sorrendjétől.

Ugyanakkor egy tömb metszéspontja önmagával nem feltétlenül a tömb, mivel eltávolítjuk a kettős bejegyzéseket.

5. Multiset kereszteződés

Egy általánosabb fogalom, amely több egyenlő bejegyzést tesz lehetővé, többkészlet. Számukra a metszéspontot ezután a bemeneti események minimális száma határozza meg. Tehát tagságunkÁllítmány meg kell tartani a pontszámot, hogy milyen gyakran adunk hozzá elemet az eredményhez.

A eltávolítás () metódus használható erre, amely visszaadja a tagságot és felemészti az elemeket. Tehát minden egyenlő elem után „B” elfogyasztják, nem adnak több egyenlő elemet az eredményhez:

public static Integer [] intersectionSet (Integer [] a, Integer [] b) {return Stream.of (a) .filter (new LinkedList (Arrays.asList (b)) :: remove) .toArray (Integer [] :: új); } 

Mivel a Tömbök Az API csak egy változhatatlant ad vissza Lista, elő kell állítanunk egy dedikált, módosíthatót.

6. Következtetés

Ebben a cikkben láttuk, hogyan kell használni a tartalmazza és eltávolítani metódusok a Java két tömbjének kereszteződésének megvalósításához.

Az összes megvalósítás, kódrészlet és teszt megtalálható a GitHub-tárházunkban - ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.


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