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.