Odstraňovanie prvkov z kolekcií Java

1. Prehľad

V tomto rýchlom návode budeme hovoriť o štyroch rôznych spôsoboch odstránenia položiek z Javy Zbierky ktoré zodpovedajú určitým predikátom.

Prirodzene sa pozrieme aj na niektoré výhrady.

2. Definovanie našej zbierky

Najskôr si ukážeme dva prístupy, ktoré mutujú pôvodnú dátovú štruktúru. Potom si povieme o ďalších dvoch možnostiach, ktoré namiesto odstránenia položiek vytvoria kópiu originálu Zbierka bez nich.

Využime nasledujúcu kolekciu v rámci našich príkladov na demonštráciu toho, ako môžeme rôznymi spôsobmi dosiahnuť rovnaký výsledok:

Názvy zbierok = nový ArrayList (); names.add ("John"); names.add ("Ana"); names.add ("Mária"); names.add ("Anthony"); names.add ("Značka");

3. Odstránenie prvkov pomocou Iterátor

Java Iterátor umožňuje nám kráčať aj odstraňovať každý jednotlivý prvok v rámci a Zbierka.

Aby sme to mohli urobiť, musíme najskôr získať iterátor nad jeho prvkami pomocou iterátor metóda. Potom môžeme navštíviť každý prvok pomocou Ďalšie a odstráňte ich pomocou odstrániť:

Iterátor i = names.iterator (); while (i.hasNext ()) {Reťazec e = i.next (); if (e.startsWith ("A")) {i.remove (); }}

Napriek svojej jednoduchosti by sme mali vziať do úvahy niekoľko výhrad:

  • V závislosti od zbierky, do ktorej môžeme naraziť ConcurrentModificationException výnimky
  • Než ich môžeme odstrániť, musíme ich iterovať
  • V závislosti od zbierky odstrániť sa môžu správať inak, ako sa očakávalo. Napr .: ArrayList.Iterator odstráni prvok zo zbierky a posúva následné údaje doľava, zatiaľ čo LinkedList.Iterator jednoducho nastaví ukazovateľ na nasledujúci prvok. Ako taký, LinkedList.Iterator podáva oveľa lepšie výsledky ako ArrayList.Iterator pri vyberaní predmetov

4. Java 8 a Collection.removeIf ()

Java 8 predstavila novú metódu pre the Zbierka rozhranie, ktoré poskytuje výstižnejší spôsob odstraňovania prvkov pomocou Predikát:

names.removeIf (e -> e.startsWith ("A"));

Je dôležité poznamenať, že na rozdiel od Iterátor prístup, removeIf má v obidvoch rovnako dobré výsledky LinkedList a ArrayList.

V prostredí Java 8 ArrayList prepíše predvolenú implementáciu - na ktorú sa spolieha Iterátor - a implementuje inú stratégiu: najskôr iteruje prvky a označuje tie, ktoré sa zhodujú s našimi Predikát; potom iteruje druhýkrát, aby odstránil (a posunul) prvky, ktoré boli označené v prvej iterácii.

5. Java 8 a úvod do Prúd

Jednou z nových hlavných funkcií v Java 8 bolo pridanie Prúd (a Zberatelia). Existuje mnoho spôsobov, ako vytvoriť Prúd zo zdroja. Väčšina operácií, ktoré majú vplyv na Prúd inštancia nebude mutovať svoj zdroj, API sa skôr zameriava na vytváranie kópií zdroja a vykonávanie akýchkoľvek operácií, ktoré v nich môžeme potrebovať.

Poďme sa pozrieť na to, ako môžeme použiť Prúd a Zberatelia nájsť / filtrovať prvky, ktoré sa zhodujú a nezhodujú s našimi Predikát.

5.1. Odstraňovanie prvkov pomocou Prúd

Odstránenie, alebo skôr filtrovanie prvkov pomocou Prúd je celkom priamy, stačí vytvoriť inštanciu Prúd pomocou nášho Zbierka, vzývať filter s našim Predikát a potom zbierať výsledok pomocou Zberatelia:

Zbierka filtrovanáCollection = názvy .stream () .filter (e ->! E.startsWith ("A")) .collect (Collectors.toList ());

Streaming je menej invazívny ako predchádzajúce prístupy, podporuje izoláciu a umožňuje vytváranie viacerých kópií z rovnakého zdroja. Mali by sme však mať na pamäti, že tiež zvyšuje pamäť používanú našou aplikáciou.

5.2. Collectors.partitioningBy

Kombinácia oboch Stream.filter a Zberatelia je celkom šikovný, hoci môžeme naraziť na scenáre, keď potrebujeme zhodné aj nezhodné prvky. V takýchto prípadoch môžeme využiť výhody Collectors.partitioningBy:

Mapa ClassifiedElements = names .stream () .collect (Collectors.partitioningBy ((String e) ->! e.startsWith ("A")))); Zodpovedanie reťazcov = String.join (",", identifiedElements.get (true)); String nonMatching = String.join (",", identifiedElements.get (false));

Táto metóda vracia a Mapa ktorý obsahuje iba dva kľúče, pravda a nepravdivé, pričom každý ukazuje na zoznam, ktorý obsahuje zhodné a nezhodné prvky.

6. Záver

V tomto článku sme sa zaoberali niektorými metódami odstraňovania prvkov z Zbierky a niektoré z ich výhrad.

Kompletný zdrojový kód a všetky útržky kódu pre tento článok nájdete na GitHub.


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