Hogyan lehet elemet találni egy listában Java-val

1. Áttekintés

Egy elem megtalálása a listában nagyon gyakori feladat, amellyel fejlesztőként találkozunk.

Ebben a gyors bemutatóban különféle módszereket tárgyalunk, amelyekkel ezt megtehetjük a Java-val.

2. Beállítás

Először kezdjük azzal, hogy meghatározzuk a Vevő POJO:

public class Ügyfél {private int id; privát karakterlánc neve; // getters / setters, egyéni hashcode / egyenlő}

Aztán egy Tömb lista ügyfelek:

Ügyféllista = new ArrayList (); customers.add (új Ügyfél (1, "Jack")); customers.add (új Ügyfél (2, "James")); customers.add (új Ügyfél (3, "Kelly")); 

Vegye figyelembe, hogy felülírtuk hash kód és egyenlő miénkben Vevő osztály.

A jelenlegi végrehajtásunk alapján egyenlő, kettő Vevő tárgyak azonosak id egyenlőnek fogják tekinteni.

Ezt a listát fogjuk használni ügyfelek az út mentén.

3. Java API használata

Maga a Java számos módon megkeresheti az elemeket a listában:

  • A tartalmazza módszer
  • A indexe módszer
  • Ad-hoc for loop
  • A Folyam API

3.1. tartalmaz ()

Lista nevű módszert tárja fel tartalmazza:

logikai elem tartalmazza (Object elem)

Ahogy a neve is sugallja, ez a módszer visszatér igaz ha a lista tartalmazza a megadottakat elem, és visszatér hamis másképp.

Tehát, ha ellenőriznünk kell, hogy létezik-e egy adott elem a listánkban, akkor:

Ügyfél james = new Customer (2, "James"); if (vásárlók.tartalmazza (james)) {// ...}

3.2. indexe()

indexe egy másik hasznos módszer az elemek megkeresésére:

int indexOf (Object elem)

Ez a módszer a megadott első előfordulásának indexét adja vissza elem az adott listában, vagy -1, ha a lista nem tartalmazza a elem.

Tehát logikusan, ha ez a módszer -1-től eltérő eredményt ad, akkor tudjuk, hogy a lista tartalmazza az elemet:

if (ügyfelek.indexOf (james)! = -1) {// ...}

A módszer alkalmazásának legfőbb előnye, hogy meg tudja mondani a megadott elem helyét az adott listában.

3.3. Alap hurok

És mi van akkor, ha egy alapon mezőalapú keresést akarunk végezni? Tegyük fel például, hogy sorsolást hirdetünk, és be kell jelentenünk a Vevő egy konkrét név mint győztes.

Ilyen terepi alapú kereséseknél áttérhetünk az iterációra.

A listán történő iterálás hagyományos módja a Java egyik looping konstrukciójának használata. Minden iterációban összehasonlítjuk a lista aktuális elemét a keresett elemmel, hogy lássuk, egyezik-e:

public Customer findUsingEnhancedForLoop (String név, ügyfelek listázása) {for (Ügyfél ügyfél: ügyfelek) {if (ügyfél.címNév (). egyenlő (név)) {visszatérő ügyfél; }} return null; }

Itt a név arra a névre utal, amelyet a megadott listában keresünk ügyfelek. Ez a módszer adja vissza az elsőt Vevő objektum a listában egyezéssel név, vagy nulla ha nincs ilyen Vevő létezik.

3.4. Hurok egy Iterátor

Iterátor egy másik módja annak, hogy bejárhatjuk az elemek listáját.

Egyszerűen felvehetjük előző példánkat, és kissé módosíthatjuk:

public Customer findUsingIterator (String neve, ügyfelek listázása) {Iterator iterator = customers.iterator (); while (iterator.hasNext ()) {Ügyfél ügyfél = iterator.next (); if (customer.getName (). egyenlő (név)) {visszatérő ügyfél; }} return null; }

Következésképpen a viselkedés ugyanaz, mint korábban.

3.5. Java 8 Folyam API

A Java 8-tól kezdve használhatjuk a Folyam API elem keresésére a Lista.

Az adott listában meghatározott feltételeknek megfelelő elem megkereséséhez:

  • hivatkozni folyam() a listán
  • hívja a filter () módszer megfelelő Állítmány
  • hívja a findAny () konstrukció, amely visszatér az első elem, amely megfelel a szűrő predikátum becsomagolva Választható ha létezik ilyen elem

Customer james = customers.stream () .filter (customer -> "James" .equals (customer.getName ())) .findAny () .orElse (null);

A kényelem érdekében alapértelmezés szerint nulla ha egy Választható üres, de ez nem mindig lehet a legjobb választás minden forgatókönyvhöz.

4. Harmadik fél könyvtárai

Most, bár a Stream API több mint elegendő, mit tegyünk, ha elakadtunk a Java korábbi verzióiban?

Szerencsére sok olyan harmadik féltől származó könyvtár található, mint a Google Guava és az Apache Commons, amelyeket használhatunk.

4.1. Google Guava

A Google Guava olyan funkciókat kínál, amelyek hasonlóak ahhoz, mint amit a streamekkel tehetünk:

Ügyfél james = Iterables.tryFind (customers, new Predicate () {public boolean Apply (Customer customer) {return "James" .equals (customer.getName ());}}).

Akárcsak Folyam API, választhatjuk, hogy az alapértelmezett értéket adjuk vissza nulla:

Ügyfél james = Iterables.tryFind (customers, new Predicate () {public boolean Apply (Customer customer) {return "James" .equals (customer.getName ());}}). Vagy (customers.get (0));

A fenti kód kiválasztja a lista első elemét, ha nem található egyezés.

Ne felejtsük el, hogy Guava a NullPointerException ha vagy a lista vagy az állítmány nulla.

4.2. Apache Commons

Szinte ugyanúgy megtalálhatunk egy elemet az Apache Commons használatával:

Ügyfél james = IterableUtils.find (ügyfelek, új Predicate () {nyilvános logikai érték (Customer customer) {return "James" .equals (customer.getName ());}};

Van néhány fontos különbség:

  1. Az Apache Commons csak visszatér nulla ha elhaladunk a nulla lista.
  2. Aztnem nyújt alapértelmezett értékű funkcionalitást, mint a guava tryFind.

5. Következtetés

Ebben a cikkben megtanultuk az elem megtalálásának különböző módjait a List, sgyors létellenőrzéssel és terepi keresések befejezésével.

Megnéztük a harmadik fél könyvtárait is Google Guava és Apache Commons a Java 8 alternatívájaként Patakok API.

Köszönjük, hogy betértél, és ne felejtsd el megnézni a példák összes forrását a GitHubon.