Kako pronaći element na popisu s Javom

1. Pregled

Pronalaženje elementa na popisu vrlo je čest zadatak na koji nailazimo kao programeri.

U ovom ćemo brzom vodiču pokriti različite načine na koje to možemo učiniti s Javom.

2. Postavljanje

Prvo krenimo definiranjem a Kupac POJO:

kupac javne klase {private int id; privatni naziv niza; // getteri / postavljači, prilagođeni hashcode / jednaki}

Zatim an ArrayList kupaca:

Popis kupaca = novi ArrayList (); customers.add (novi kupac (1, "Jack")); kupci.add (novi kupac (2, "James")); customers.add (novi kupac (3, "Kelly")); 

Imajte na umu da smo nadjačali hashCode i jednako u našem Kupac razred.

Na temelju naše trenutne provedbe jednako, dva Kupac objekti s istim iskaznica smatrat će se jednakim.

Koristit ćemo ovaj popis kupci Putem.

3. Korištenje Java API-ja

Sama Java nudi nekoliko načina pronalaska stavke na popisu:

  • The sadrži metoda
  • The indexOf metoda
  • Ad-hoc petlja za
  • The Stream API

3.1. sadrži ()

Popis izlaže metodu tzv sadrži:

boolean sadrži (element objekta)

Kao što naziv govori, ova metoda se vraća pravi ako popis sadrži navedeno element, i vraća se lažno inače.

Dakle, kada moramo provjeriti postoji li određena stavka na našem popisu, možemo:

Kupac James = novi kupac (2, "James"); if (customers.contens (james)) {// ...}

3.2. indexOf ()

indexOf je još jedna korisna metoda za pronalaženje elemenata:

int indexOf (element objekta)

Ova metoda vraća indeks prvog pojavljivanja navedenog element na danom popisu ili -1 ako popis ne sadrži element.

Dakle, logično, ako ova metoda vrati bilo što drugo osim -1, znamo da popis sadrži element:

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

Glavna prednost korištenja ove metode je što nam može reći položaj navedenog elementa na danom popisu.

3.3. Osnovno petlje

Što ako sada želimo izvršiti terensko pretraživanje elementa? Na primjer, recimo da najavljujemo lutriju i moramo proglasiti a Kupac s određenim Ime kao pobjednik.

Za takva pretraživanja na terenu možemo se obratiti iteraciji.

Tradicionalni način ponavljanja popisa je korištenje jedne od Java konstrukcija petlje. U svakoj iteraciji uspoređujemo trenutnu stavku na popisu s elementom koji tražimo kako bismo provjerili odgovara li:

javni kupac findUsingEnhancedForLoop (naziv niza, popis kupaca) {for (kupac kupac: kupci) {if (customer.getName (). jednako (ime)) {return kupac; }} return null; }

Ovdje Ime odnosi se na ime koje tražimo na danom popisu kupci. Ova metoda vraća prvu Kupac objekt na popisu s podudaranjem Ime, ili null ako nema takvih Kupac postoji.

3.4. Looping s Iterator

Iterator je još jedan način na koji možemo preći popis predmeta.

Jednostavno možemo uzeti naš prethodni primjer i malo ga doraditi:

javni kupac findUsingIterator (naziv niza, popis kupaca) {iterator iteratora = customers.iterator (); while (iterator.hasNext ()) {Kupac kupac = iterator.next (); if (customer.getName (). equals (name)) {return kupac; }} return null; }

Slijedom toga, ponašanje je isto kao i prije.

3.5. Java 8 Stream API

Od Jave 8 možemo koristiti i Stream API za pronalaženje elementa u a Popis.

Da bismo pronašli element koji odgovara određenim kriterijima na danom popisu, mi:

  • prizivati stream () na listi
  • nazovite filter () metoda s pravilnim Predikat
  • nazovite findAny () konstrukt, koji se vraća prvi element koji odgovara filtar predikat umotan u an Neobvezno ako takav element postoji

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

Radi praktičnosti, zadani smo za null u slučaju da Neobvezno je prazno, ali ovo možda nije uvijek najbolji izbor za svaki scenarij.

4. Knjižnice trećih strana

Sada, iako je Stream API više nego dovoljan, što bismo trebali učiniti ako smo zapeli na starijoj verziji Jave?

Srećom, postoje mnoge biblioteke trećih strana poput Google Guava i Apache Commons koje možemo koristiti.

4.1. Google Guava

Google Guava pruža funkcionalnost koja je slična onoj što možemo raditi s streamovima:

Kupac james = Iterables.tryFind (kupci, novi Predikat () {primjenjuje se javna logička vrijednost (kupac kupac) {return "James" .equals (customer.getName ());}}). OrNull ();

Baš kao i kod Stream API, po želji možemo odabrati da vratimo zadanu vrijednost umjesto null:

Kupac james = Iterables.tryFind (kupci, novi Predicate () {primjenjuje se javna logička vrijednost (kupac kupac) {return "James" .equals (customer.getName ());}}) ili (customers.get (0));

Gornji će kôd odabrati prvi element na popisu ako nije pronađeno podudaranje.

Također, ne zaboravite da Guava baca a NullPointerException ako je ili popis ili predikat null.

4.2. Apache Commons

Element možemo pronaći na gotovo potpuno isti način pomoću Apache Commons:

Kupac james = IterableUtils.find (kupci, novi Predikat () {javna logička procjena (kupac kupac) {return "James" .equals (customer.getName ());}});

Ipak postoji nekoliko važnih razlika:

  1. Apache Commons se samo vraća null ako prođemo a null popis.
  2. Tone pruža funkcionalnost zadanih vrijednosti poput Guavine tryFind.

5. Zaključak

U ovom smo članku naučili različite načine pronalaska elementa u a Popis, startiranje brzim provjerama postojanja i završetak pretraživanja na terenu.

Također smo pogledali biblioteke trećih strana Google Guava i Apache Commons kao alternative Javi 8 Potoci API.

Hvala što ste navratili i ne zaboravite provjeriti sve izvore za ove primjere na GitHubu.