Ako nájsť prvok v zozname pomocou Java

1. Prehľad

Nájdenie prvku v zozname je veľmi častá úloha, s ktorou sa ako vývojári stretávame.

V tomto rýchlom výučbe sa budeme venovať rôznym spôsobom, ako to môžeme urobiť v prostredí Java.

2. Inštalácia

Najprv začnime definovaním a Zákazník POJO:

public class Customer {private int id; súkromné ​​meno reťazca; // getre / setre, vlastný hashcode / equals}

Potom ArrayList zákazníkov:

Zoznam zákazníkov = nový ArrayList (); customers.add (nový zákazník (1, „Jack“)); customers.add (nový zákazník (2, „James“)); customers.add (nový zákazník (3, „Kelly“)); 

Všimnite si, že sme prepísali hashCode a rovná sa v našom Zákazník trieda.

Na základe našej súčasnej implementácie rovná sa, dva Zákazník predmety s rovnakými id sa bude považovať za rovnocenné.

Použijeme tento zoznam zákazníkov pozdĺž cesty.

3. Používanie Java API

Samotná Java poskytuje niekoľko spôsobov, ako nájsť položku v zozname:

  • The obsahuje metóda
  • The indexOf metóda
  • Ad-hoc pre slučku
  • The Prúd API

3.1. obsahuje ()

Zoznam vystavuje metódu zvanú obsahuje:

boolean obsahuje (element objektu)

Ako naznačuje názov, táto metóda sa vracia pravda ak zoznam obsahuje zadané element, a vráti sa nepravdivé inak.

Takže keď potrebujeme skontrolovať, či v našom zozname existuje konkrétna položka, môžeme:

James zákazníka = nový zákazník (2, „James“); if (customers.contains (james)) {// ...}

3.2. indexOf ()

indexOf je ďalšou užitočnou metódou na hľadanie prvkov:

int indexOf (Object element)

Táto metóda vráti index prvého výskytu zadaného element v danom zozname alebo -1, ak zoznam neobsahuje element.

Logicky teda, ak táto metóda vráti čokoľvek iné ako -1, vieme, že zoznam obsahuje prvok:

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

Hlavnou výhodou použitia tejto metódy je, že nám môže povedať polohu zadaného prvku v danom zozname.

3.3. Základné opakovanie

Čo teraz, keď chceme vyhľadať prvok v poli? Povedzme napríklad, že vyhlasujeme lotériu a musíme vyhlásiť a Zákazník s konkrétnym názov ako víťaz.

Pri takýchto terénnych vyhľadávaniach sa môžeme obrátiť na iteráciu.

Tradičným spôsobom iterácie v zozname je použitie jedného zo štruktúrovaných cyklov Java. V každej iterácii porovnávame aktuálnu položku v zozname s hľadaným prvkom, aby sme zistili, či ide o zhodu:

public Customer findUsingEnhancedForLoop (názov reťazca, zoznam zákazníkov) {pre (zákazník zákazníka: zákazníci) {if (customer.getName (). equals (name)) {návrat zákazníka; }} return null; }

Tu názov odkazuje na meno, ktoré hľadáme v danom zozname zákazníkov. Táto metóda vráti prvú Zákazník objekt v zozname so zhodou názovalebo nulový ak nie také Zákazník existuje.

3.4. Opakovanie s Iterátor

Iterátor je ďalší spôsob, ako môžeme prechádzať zoznamom položiek.

Môžeme si jednoducho vziať náš predchádzajúci príklad a trochu ho vylepšiť:

public Customer findUsingIterator (názov reťazca, zoznam zákazníkov) {Iterator iterator = customers.iterator (); while (iterator.hasNext ()) {Zákazník zákazníka = iterator.next (); if (customer.getName (). equals (name)) {return customer; }} return null; }

V dôsledku toho je správanie rovnaké ako predtým.

3.5. Java 8 Prúd API

Od verzie Java 8 môžeme tiež používať Prúd API na vyhľadanie prvku v a Zoznam.

Ak chcete nájsť prvok vyhovujúci konkrétnym kritériám v danom zozname, vykonáme tieto kroky:

  • vzývať Prúd() na zozname
  • zavolajte na filter () metóda s riadnym Predikát
  • zavolajte na findAny () konštrukt, ktorý sa vráti prvý prvok, ktorý sa zhoduje s filter predikát zabalený do Voliteľné ak taký prvok existuje

James zákazníka = customers.stream () .filter (customer -> "James" .equals (customer.getName ())) .findAny () .orElse (null);

Pre pohodlie máme predvolenú hodnotu nulový v prípade, že Voliteľné je prázdny, ale nemusí to byť vždy najlepšia voľba pre každý scenár.

4. Knižnice tretích strán

Teraz, keď je Stream API viac ako dostatočné, čo robiť, ak zostaneme na staršej verzii Java?

Našťastie existuje veľa knižníc tretích strán, ako sú napríklad Google Guava a Apache Commons, ktoré môžeme použiť.

4.1. Google Guava

Google Guava poskytuje funkcie podobné tým, ktoré môžeme robiť so streammi:

Customer james = Iterables.tryFind (customers, new Predicate () {public boolean apply (Customer customer) {return "James" .equals (customer.getName ());}}). OrNull ();

Rovnako ako s Prúd API, môžeme voliteľne zvoliť vrátenie predvolenej hodnoty namiesto nulový:

Customer james = Iterables.tryFind (customers, new Predicate () {public boolean apply (Customer customer) {return "James" .equals (customer.getName ());}}). Or (customers.get (0));

Vyššie uvedený kód vyberie prvý prvok v zozname, ak sa nenájde zhoda.

Nezabudnite tiež, že Guava hodí a NullPointerException ak je zoznam alebo predikát nulový.

4.2. Apache Commons

Element môžeme nájsť takmer úplne rovnakým spôsobom pomocou Apache Commons:

James zákazníka = IterableUtils.find (zákazníci, nový Predicate () {verejné boolean vyhodnotenie (zákazník zákazníka) {return "James" .equals (customer.getName ());}});

Existuje však niekoľko dôležitých rozdielov:

  1. Apache Commons sa práve vracia nulový ak minieme a nulový zoznam.
  2. Toneposkytuje funkcie predvolenej hodnoty, ako je Guava tryFind.

5. Záver

V tomto článku sme sa naučili rôzne spôsoby hľadania prvku v a Zoznam, startovanie s rýchlymi kontrolami existencie a dokončenie vyhľadávania v teréne.

Pozreli sme sa tiež na knižnice tretích strán Google Guava a Apache Commons ako alternatívy k Java 8 Prúdy API.

Ďakujeme, že ste sa zastavili, a nezabudnite si pozrieť všetky zdroje týchto príkladov na GitHub.


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