Hvordan finne et element i en liste med Java

1. Oversikt

Å finne et element i en liste er en veldig vanlig oppgave vi kommer over som utviklere.

I denne raske opplæringen vil vi dekke forskjellige måter vi kan gjøre dette på Java.

2. Oppsett

La oss først starte med å definere en Kunde POJO:

offentlig klasse kunde {privat int id; privat strengnavn; // getters / setters, tilpasset hashcode / tilsvarer}

Så en ArrayList av kunder:

Listekunder = ny ArrayList (); customers.add (ny kunde (1, "Jack")); customers.add (ny kunde (2, "James")); customers.add (ny kunde (3, "Kelly")); 

Merk at vi har overstyrt hashCode og er lik i vår Kunde klasse.

Basert på vår nåværende implementering av er lik, to Kunde gjenstander med det samme id vil bli vurdert som likeverdige.

Vi bruker denne listen over kunder langs veien.

3. Bruke Java API

Java selv gir flere måter å finne et element i en liste:

  • De inneholder metode
  • De oversikt over metode
  • En ad-hoc for loop
  • De Strøm API

3.1. inneholder ()

Liste avslører en metode som heter inneholder:

boolsk inneholder (Objektelement)

Som navnet antyder, returnerer denne metoden ekte hvis listen inneholder det angitte element, og kommer tilbake falsk ellers.

Så når vi trenger å sjekke om et bestemt element finnes i listen vår, kan vi:

Kunde james = ny kunde (2, "James"); hvis (kunder. inneholder (james)) {// ...}

3.2. oversikt over()

oversikt over er en annen nyttig metode for å finne elementer:

int indexOf (Objektelement)

Denne metoden returnerer indeksen for den første forekomsten av det angitte element i den gitte listen, eller -1 hvis listen ikke inneholder element.

Så logisk, hvis denne metoden returnerer noe annet enn -1, vet vi at listen inneholder elementet:

hvis (kunder.indexOf (james)! = -1) {// ...}

Den største fordelen med å bruke denne metoden er at den kan fortelle oss plasseringen til det spesifiserte elementet i den gitte listen.

3.3. Grunnleggende looping

Nå hva om vi vil gjøre et feltbasert søk etter et element? Si for eksempel at vi kunngjør et lotteri, og at vi må erklære et Kunde med en spesifikk Navn som vinneren.

For slike feltbaserte søk kan vi vende oss til iterasjon.

En tradisjonell måte å gjenta gjennom en liste er å bruke en av Java's looping-konstruksjoner. I hver iterasjon sammenligner vi gjeldende element i listen med elementet vi leter etter for å se om det samsvarer:

offentlig kunde findUsingEnhancedForLoop (strengnavn, liste kunder) {for (kundekunde: kunder) {hvis (customer.getName (). tilsvarer (navn)) {retur kunde; }} returner null; }

Her er Navn refererer til navnet vi søker etter i den gitte listen over kunder. Denne metoden returnerer den første Kunde objekt i listen med en samsvarende Navn, eller null hvis ikke noe slikt Kunde eksisterer.

3.4. Looping With an Iterator

Iterator er en annen måte vi kan krysse en liste over ting på.

Vi kan bare ta vårt forrige eksempel og tilpasse det litt:

offentlig kunde findUsingIterator (strengnavn, listekunder) {Iterator iterator = kunder.iterator (); mens (iterator.hasNext ()) {Kundekunde = iterator.next (); hvis (customer.getName (). tilsvarer (name)) {retur kunde; }} returner null; }

Følgelig er oppførselen den samme som før.

3.5. Java 8 Strøm API

Fra og med Java 8 kan vi også bruke Strøm API for å finne et element i en Liste.

For å finne et element som samsvarer med spesifikke kriterier i en gitt liste, gjør vi følgende:

  • påkalle strøm() på listen
  • Ring filter () metode med en skikkelig Predikere
  • Ring findAny () konstruksjon, som returnerer det første elementet som samsvarer med filter predikat innpakket i et Valgfri hvis et slikt element eksisterer

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

For enkelhets skyld er vi standard null i tilfelle en Valgfri er tom, men dette er ikke alltid det beste valget for hvert scenario.

4. Tredjepartsbiblioteker

Nå, mens Stream API er mer enn tilstrekkelig, hva skal vi gjøre hvis vi sitter fast på en tidligere versjon av Java?

Heldigvis er det mange tredjepartsbiblioteker som Google Guava og Apache Commons som vi kan bruke.

4.1. Google Guava

Google Guava tilbyr funksjoner som ligner på det vi kan gjøre med strømmer:

Customer james = Iterables.tryFind (kunder, nytt predikat () {public boolean apply (Customer customer) {return "James" .equals (customer.getName ());}}). OrNull ();

Akkurat som med Strøm API, kan vi velge å returnere en standardverdi i stedet for null:

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

Ovennevnte kode vil velge det første elementet i listen hvis ingen samsvar blir funnet.

Ikke glem at Guava kaster en NullPointerException hvis enten listen eller predikatet er null.

4.2. Apache Commons

Vi kan finne et element på nesten nøyaktig samme måte ved hjelp av Apache Commons:

Customer james = IterableUtils.find (kunder, nytt predikat () {public boolean evaluere (kundekunde) {return "James" .equals (customer.getName ());}});

Det er imidlertid et par viktige forskjeller:

  1. Apache Commons kommer nettopp tilbake null hvis vi passerer en null liste.
  2. Dengir ikke standardverdifunksjonalitet som Guava tryFind.

5. Konklusjon

I denne artikkelen lærte vi forskjellige måter å finne et element i en Liste, starting med raske eksistenssjekker og etterbehandling med feltbaserte søk.

Vi så også på tredjepartsbibliotekene Google Guava og Apache Commons som alternativer til Java 8 Strømmer API.

Takk for at du var innom, og husk å sjekke ut alle kildene for disse eksemplene på GitHub.


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