Priesečník dvoch zoznamov v Jave

1. Prehľad

V tomto tutoriále sa naučíme, ako načítať križovatku dvoch Zoznams.

Rovnako ako mnoho iných vecí, aj toto sa stalo oveľa jednoduchším vďaka zavedeniu streamov v prostredí Java 8.

2. Priesečník dvoch zoznamov reťazcov

Vytvorme dve Zoznams z Strings nejakou križovatkou - obe majú niektoré duplicitné prvky:

Zoznam zoznamu = Arrays.asList ("červená", "modrá", "modrá", „zelená", „červená"); Zoznam otherList = Arrays.asList ("červená", "zelená", "zelená", "žltá");

A teraz určíme priesečník zoznamov pomocou metód streamu:

Nastaviť výsledok = list.stream () .distinct () .filter (otherList :: contains) .collect (Collectors.toSet ()); Set commonElements = new HashSet (Arrays.asList ("red", "green")); Assert.assertEquals (commonElements, result);

Najskôr odstránime duplicitné prvky pomocou odlišný. Potom použijeme filter na výber prvkov, ktoré sú tiež obsiahnuté v otherList.

Nakoniec náš výstup prevedieme pomocou a Zberateľ. Križovatka by mala obsahovať všetky spoločné prvky iba raz. Na poradí by teda nemalo záležať nastaviť je najpriamejšou voľbou, ale môžeme ju tiež použiť listovať alebo inou kolektorovou metódou.

Ďalšie informácie nájdete v našom sprievodcovi zberateľmi Java 8’s.

3. Križovatka zoznamov vlastných tried

Čo ak náš Zoznamneobsahujú Stringale skôr inštancie vlastnej triedy, ktorú sme vytvorili? Pokiaľ sa budeme riadiť konvenciami Javy, riešenie s metódami streamovania bude pre našu vlastnú triedu fungovať dobre.

Ako to robí obsahuje metóda rozhodne, či sa konkrétny objekt objaví v zozname? Založený na rovná sa metóda. Preto musíme prekonať rovná sa metóda a uistite sa, že porovnáva dva objekty na základe hodnôt príslušných vlastností.

Napríklad dva obdĺžniky sú si rovné, ak sú ich šírky a výšky rovnaké.

Ak neprepíšeme rovná sa metóda, naša trieda používa rovná sa implementácia materskej triedy. Na konci dňa, lepšie povedané, dedičský reťazec, Objekt trieda' rovná sa metóda sa vykoná. Potom sú si dve inštancie rovnaké, iba ak odkazujú na presne ten istý objekt na halde.

Pre viac informácií o rovná sa metóda nájdete v našom článku o Jave rovná sa () a hashCode () Zmluvy.

4. Záver

V tomto rýchlom článku sme videli, ako pomocou prúdov vypočítať priesečník dvoch zoznamov. Existuje mnoho ďalších operácií, ktoré bývali dosť zdĺhavé, ale sú celkom jednoduché, ak poznáme cestu okolo rozhrania Java Stream API. Tu sa pozrite na naše ďalšie návody s prúdmi Java.

Príklady kódov sú k dispozícii na GitHub.


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