Priesečník medzi dvoma celočíselnými poliami

1. Prehľad

V tejto rýchlej príručke sa pozrieme na to, ako na to vypočítať križovatku medzi dvoma celočíselnými poliami „A“ a „B“.

Zameriame sa tiež na to, ako zaobchádzať s duplicitnými záznamami.

Na implementáciu použijeme Prúdy.

2. Predikát členstva v poli

Priesečník dvoch množín je z definície množina so všetkými hodnotami z jednej, ktoré sú tiež súčasťou druhej množiny.

Preto potrebujeme a Funkcia alebo skôr a Predikát rozhodnúť o členstve v druhom poli. Odkedy Zoznam poskytuje takúto metódu po vybalení z krabice, transformujeme ju na a Zoznam:

Predikát isContainedInB = Arrays.asList (b) :: obsahuje; 

3. Budovanie križovatky

Aby sme vytvorili výsledné pole, zvážime postupne prvky prvej sady a overíme, či sú obsiahnuté aj v druhom poli.Na základe toho potom vytvoríme nové pole.

The Prúd API nám poskytuje potrebné metódy. Najskôr vytvoríme a Prúd, potom filtrovať podľa členstvaPredikát a nakoniec vytvoríme nové pole:

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

4. Duplicitné záznamy

Keďže polia v Jave sú č Nastaviť implementácii čelíme problému duplicitných záznamov vo vstupe a potom vo výsledku. Všimnite si, že počet výskytov vo výsledku závisí od výskytov v prvom parametri.

Ale pre množiny sa prvky nesmú vyskytovať viackrát. Môžeme to archivovať pomocou odlišný() metóda:

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

Takže dĺžka križovatky už nezávisí od poradia parametrov.

Priesečník poľa so sebou samým však nemusí byť opäť poľom, pretože odstraňujeme dvojité položky.

5. Križovatka viacerých skupín

Všeobecnejšia predstava, ktorá umožňuje viac rovnakých záznamov, je multiset. Pre nich je potom priesečník definovaný minimálnym počtom vstupných výskytov. Takže naše členstvo-Predikát musí udržiavať skóre, ako často pridávame do výsledku prvok.

The odstrániť () Môže sa na to použiť metóda, ktorá vráti členstvo a spotrebuje prvky. Takže po všetkých rovnakých prvkoch v „B“ sú spotrebované, do výsledku sa nepridávajú ďalšie rovnaké prvky:

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

Keďže Polia API vráti iba nemenné Zoznam, musíme vygenerovať vyhradený premenlivý.

6. Záver

V tomto článku sme videli, ako používať obsahuje a odstrániť metódy implementácie križovatky pre dve polia v Jave.

Všetky implementácie, útržky kódu a testy nájdete v našom úložisku GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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