Uklanjanje elemenata iz Java kolekcija

1. Pregled

U ovom brzom vodiču, razgovarat ćemo o četiri različita načina uklanjanja predmeta s Jave Zbirke koji odgovaraju određenim predikatima.

Prirodno ćemo pogledati i neka upozorenja.

2. Definiranje naše kolekcije

Prvo ćemo ilustrirati dva pristupa koja mutiraju izvornu strukturu podataka. Zatim ćemo razgovarati o dvije druge mogućnosti koje će umjesto uklanjanja predmeta stvoriti kopiju izvornika Kolekcija bez njih.

Upotrijebimo sljedeću kolekciju kroz naše primjere da pokažemo kako možemo postići isti rezultat koristeći različite metode:

Imena zbirki = novi ArrayList (); names.add ("Ivan"); names.add ("Ana"); imena.add ("Marija"); names.add ("Anthony"); names.add ("Oznaka");

3. Uklanjanje elemenata pomoću Iterator

Java Iterator omogućuje nam hodati i uklanjati svaki pojedinačni element unutar a Kolekcija.

Da bismo to učinili, prvo moramo dohvatiti iterator nad njegovim elementima pomoću iterator metoda. Nakon toga svaki element možemo posjetiti uz pomoć Sljedeći i uklonite ih pomoću ukloniti:

Iterator i = names.iterator (); while (i.hasNext ()) {String e = i.next (); if (e.startsWith ("A")) {i.remove (); }}

Unatoč svojoj jednostavnosti, valja uzeti u obzir nekoliko upozorenja:

  • Ovisno o zbirci na koju bismo mogli naletjeti ConcurrentModificationException iznimke
  • Moramo prelistati elemente prije nego što ih možemo ukloniti
  • Ovisno o zbirci, ukloniti mogu se ponašati drugačije od očekivanog. Npr .: ArrayList.Iterator uklanja element iz zbirke i pomiče daljnje podatke ulijevo, dok, LinkedList.Iterator jednostavno podešava pokazivač na sljedeći element. Kao takav, LinkedList.Iterator izvodi mnogo bolje od ArrayList.Iterator prilikom uklanjanja predmeta

4. Java 8 i Collection.removeIf ()

Java 8 uvela je novu metodu u the Kolekcija sučelje koje pruža sažetiji način uklanjanja elemenata pomoću Predikat:

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

Važno je napomenuti da suprotno Iterator pristup, ukloniAko izvodi slično dobro u obje LinkedList i ArrayList.

U Javi 8, ArrayList nadjačava zadanu implementaciju - koja se oslanja na Iterator - i provodi drugačiju strategiju: prvo, prevlači elemente i označava one koji se podudaraju s našim Predikat; nakon toga, ponavlja se drugi put da ukloni (i pomakne) elemente koji su označeni u prvoj iteraciji.

5. Java 8 i uvod u Stream

Jedna od novih glavnih značajki Java 8 bila je dodavanje Stream (i Kolekcionari). Postoji mnogo načina za stvaranje a Stream iz izvora. Međutim, većina operacija koje utječu na Stream instanca neće mutirati svoj izvor, već se API fokusira na stvaranje kopija izvora i izvršavanje bilo koje radnje koja bi nam u njima trebala.

Pogledajmo kako se možemo koristiti Stream i Kolekcionari pronaći / filtrirati elemente koji se podudaraju i ne podudaraju s našim Predikat.

5.1. Uklanjanje elemenata pomoću Stream

Uklanjanje, ili bolje rečeno, filtriranje elemenata pomoću Stream je sasvim izravno, samo trebamo stvoriti instancu Stream koristeći naš Kolekcija, zazivati filtar s našim Predikat i onda prikupiti rezultat uz pomoć Kolekcionari:

Zbirka filteredCollection = imena .stream () .filter (e ->! E.startsWith ("A")) .collect (Collectors.toList ());

Strujanje je manje invazivan od prethodnih pristupa, potiče izolaciju i omogućuje stvaranje više kopija iz istog izvora. Međutim, trebali bismo imati na umu da to također povećava memoriju koju koristi naša aplikacija.

5.2. Kolekcionari.podjelaBy

Kombinirajući oboje Stream.filter i Kolekcionari je vrlo zgodan, iako možemo naići na scenarije u kojima su nam potrebni i podudarni i nepodudarajući elementi. U takvim slučajevima možemo iskoristiti Kolekcionari.podjelaBy:

Karta classicElements = imena .stream () .collect (Collectors.partitioningBy ((String e) ->! e.startsWith ("A"))); Podudaranje niza = String.join (",", ClassiElements.get (true)); String nonMatching = String.join (",", ClassiElements.get (false));

Ova metoda vraća a Karta koji sadrži samo dva ključa, pravi i lažno, svaki koji upućuje na popis koji sadrži odgovarajuće, odnosno nepodudarajuće elemente.

6. Zaključak

U ovom smo članku pogledali neke metode za uklanjanje elemenata iz Zbirke i neka njihova upozorenja.

Kompletni izvorni kod i sve isječke koda za ovaj članak možete pronaći na GitHubu.


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