Elemek eltávolítása Java gyűjteményekből

1. Áttekintés

Ebben a gyors bemutatóban az elemek Java eltávolításának négy különböző módjáról fogunk beszélni Gyűjtemények amelyek megegyeznek bizonyos predikátumokkal.

Természetesen megnézzük néhány figyelmeztetést is.

2. Gyűjteményünk meghatározása

Először két megközelítést mutatunk be, amelyek az eredeti adatszerkezetet mutatják. Ezután két másik lehetőségről beszélünk, amelyek az elemek eltávolítása helyett létrehozzák az eredeti másolatát Gyűjtemény nélkülük.

Használjuk a következő gyűjteményt példáinkban annak bemutatására, hogyan érhetjük el ugyanazt az eredményt különböző módszerekkel:

Gyűjteménynevek = new ArrayList (); nevek.add ("János"); nevek.add ("Ana"); nevek.add ("Mária"); nevek.add ("Anthony"); nevek.add ("Mark");

3. Elemek eltávolítása a Iterátor

Java Iterátor lehetővé teszi számunkra, hogy mind az egyes elemeket járjuk, mind eltávolítsuk a Gyűjtemény.

Ehhez először be kell szereznünk egy iterátort az elemei felett a iterátor módszer. Utána minden elemet meglátogathatunk a segítségével következő és a gombbal távolítsa el őket eltávolítani:

Iterátor i = nevek.iterátor (); while (i.hasNext ()) {String e = i.next (); if (e.startsWith ("A")) {i.remove (); }}

Az egyszerűsége ellenére van néhány figyelmeztetés, amelyet figyelembe kell vennünk:

  • A gyűjteménytől függően előfordulhat, hogy összefutunk ConcurrentModificationException kivételek
  • Iterálnunk kell az elemeket, mielőtt eltávolíthatnánk őket
  • A gyűjteménytől függően eltávolítani a várakozásoktól eltérően viselkedhet. Például.: ArrayList.Iterator eltávolítja az elemet a gyűjteményből, és a későbbi adatokat balra tolja, míg LinkedList.Iterator egyszerűen igazítja a mutatót a következő elemhez. Mint olyan, LinkedList.Iterator sokkal jobban teljesít, mint ArrayList.Iterator elemek eltávolításakor

4. Java 8 és Collection.removeIf ()

A Java 8 új módszert vezetett be a Gyűjtemény felület, amely tömörebb módon biztosítja az elemek eltávolítását a Állítmány:

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

Fontos megjegyezni, hogy ellentétben a Iterátor megközelítés, removeIf hasonlóan jól teljesít mindkettőben LinkedList és Tömb lista.

Java 8-ban, Tömb lista felülbírálja az alapértelmezett megvalósítást - amelyre támaszkodik Iterátor - és egy másik stratégiát valósít meg: először is iterál az elemek felett, és megjelöli azokat, amelyek megfelelnek a miénknek Állítmány; utána másodszor ismétli az első iterációban megjelölt elemek eltávolítását (és eltolását).

5. Java 8 és a bevezetése Folyam

A Java 8 egyik új fő jellemzője a Folyam (és Gyűjtők). A. Létrehozásának számos módja van Folyam forrásból. Azonban a legtöbb műveletet, amely befolyásolja a Folyam példány nem mutálja meg a forrását, inkább az API összpontosít egy forrás másolatainak létrehozására és minden szükséges művelet végrehajtására.

Vessünk egy pillantást arra, hogyan tudjuk használni Folyam és Gyűjtők megtalálni / szűrni az elemeket, amelyek megfelelnek és nem egyeznek a mi Állítmány.

5.1. Elemek eltávolítása a Folyam

Eltávolítása, vagy inkább elemek szűrése Folyam meglehetősen egyértelmű, csak létre kell hoznunk a Folyam a mi felhasználásával Gyűjtemény, hivatkozás szűrő velünk Állítmány és akkor gyűjt segítségével az eredmény Gyűjtők:

Gyűjtemény filteredCollection = nevek .stream () .filter (e ->! E.startsWith ("A")) .collect (Collectors.toList ());

Folyó kevésbé invazív, mint a korábbi megközelítések, elősegíti az elszigeteltséget és lehetővé teszi több másolat létrehozását ugyanabból a forrásból. Nem szabad megfeledkeznünk arról, hogy ez növeli az alkalmazásunk által használt memóriát is.

5.2. Gyűjtők.partitioningBy

Mindkettőt egyesítve Patak.szűrő és Gyűjtők elég praktikus, bár belefuthatunk olyan forgatókönyvekbe, ahol szükségünk van egyező és nem egyező elemekre. Ilyen esetekben kihasználhatjuk Gyűjtők.partitioningBy:

Térkép osztályozottElementek = nevek .stream () .collect (Collectors.partitioningBy ((E karakterlánc) ->! e.startsWith ("A"))); Karakterlánc-illesztés = String.join (",", osztályozottElementek.get (igaz)); String nonMatching = String.join (",", osztályozottElement.get (hamis));

Ez a módszer a Térkép amely csak két kulcsot tartalmaz, igaz és hamis, mindegyik egy listára mutat, amely tartalmazza a megfelelő, illetve a nem egyező elemeket.

6. Következtetés

Ebben a cikkben megvizsgáltunk néhány módszert az elemek eltávolítására Gyűjtemények és néhány figyelmeztetésük.

A cikk teljes forráskódját és összes kódrészletét a GitHubon találja meg.


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