So finden Sie ein Element in einer Liste mit Java

So finden Sie ein Element in einer Liste mit Java

1. Überblick

Das Finden eines Elements in einer Liste ist eine sehr häufige Aufgabe, die uns als Entwickler begegnet.

In diesem kurzen Tutorial werden wir verschiedene Möglichkeiten behandeln, wie wir dies mit Java tun können.

Weitere Lektüre:

Überprüfen, ob eine Liste in Java sortiert ist

Lernen Sie verschiedene Algorithmen, um zu überprüfen, ob eine Liste in Java sortiert ist.

Read more

Java-Listeninitialisierung in einer Zeile

In diesem kurzen Tutorial untersuchen wir, wie wir eine Liste mit Einzeilern initialisieren können.

Read more

2. Konfiguration

Beginnen wir mit der Definition des POJO einesCustomer:

public class Customer {

    private int id;
    private String name;

    // getters/setters, custom hashcode/equals
}

Und einArrayList der Kunden:

List customers = new ArrayList<>();
customers.add(new Customer(1, "Jack"));
customers.add(new Customer(2, "James"));
customers.add(new Customer(3, "Kelly"));

Beachten Sie, dass wirhashCode undequals in unsererCustomer-Klasse überschrieben haben.

Basierend auf unserer aktuellen Implementierung vonequals werden zweiCustomer-Objekte mit denselbenid als gleich betrachtet.

Wir werden diese Liste voncustomers auf dem Weg verwenden.

3. Verwenden der Java-API

Java selbst bietet verschiedene Möglichkeiten, um ein Element in einer Liste zu finden:

  • Diecontains-Methode

  • DieindexOf -Methode

  • An ad-hoc for loop und

  • DerStream API

3.1. contains()

List macht eine Methode namenscontains verfügbar:

boolean contains(Object element)

Wie der Name schon sagt, gibt diese Methodetrue zurück, wenn die Liste die angegebenenelement, enthält, andernfallsfalse. 

Wenn wir also nur überprüfen müssen, ob ein bestimmtes Element in unserer Liste vorhanden ist, können wir Folgendes tun:

Customer james = new Customer(2, "James");
if (customers.contains(james)) {
    // ...
}

3.2. indexOf()

indexOf ist eine weitere nützliche Methode zum Auffinden von Elementen:

int indexOf(Object element)

Diese Methode gibt den Index des ersten Auftretens der angegebenenelement in der angegebenen Liste zurück oder -1, wenn die Liste dieelement nicht enthält.

Wenn diese Methode also etwas anderes als -1 zurückgibt, wissen wir logischerweise, dass die Liste das Element enthält:

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

Der Hauptvorteil dieser Methode besteht darin, dass sie uns die Position des angegebenen Elements in der angegebenen Liste mitteilen kann.

3.3. Grundlegendes Looping

Aber was ist, wenn wir eine feldbasierte Suche nach einem Element durchführen möchten? Angenommen, wir kündigen eine Lotterie an und müssen einCustomer mit einem bestimmtenname als Gewinner deklarieren.

Für solche feldbasierten Suchen können wir uns der Iteration zuwenden.

Eine herkömmliche Methode zum Durchlaufen einer Liste besteht darin, eines der Konstrukte vonJava’s loopingzu verwenden. In jeder Iteration vergleichen wir das aktuelle Element in der Liste mit dem Element, nach dem wir suchen, um festzustellen, ob es übereinstimmt:

public Customer findUsingEnhancedForLoop(
  String name, List customers) {

    for (Customer customer : customers) {
        if (customer.getName().equals(name)) {
            return customer;
        }
    }
    return null;
}

Hier bezieht sichname auf den Namen, nach dem wir in der angegebenen Liste voncustomers suchen. Diese Methode gibt das ersteCustomer-Objekt in der Liste mit einem übereinstimmendenname undnull zurück, wenn kein solchesCustomer vorhanden ist.

3.4. Schleifen mit einemIterator

Iterator ist eine weitere Möglichkeit, eine Liste von Elementen zu durchlaufen.

Wir können einfach unser vorheriges Beispiel nehmen und es ein wenig optimieren:

public Customer findUsingIterator(
  String name, List customers) {
    Iterator iterator = customers.iterator();
    while (iterator.hasNext()) {
        Customer customer = iterator.next();
        if (customer.getName().equals(name)) {
            return customer;
        }
    }
    return null;
}

Und das Verhalten ist das gleiche wie zuvor.

3.5. Java 8Stream API

Ab Java 8 können wir auchuse the Stream API finden, um ein Element inList. zu finden

Um ein Element zu finden, das bestimmten Kriterien in einer bestimmten Liste entspricht, gehen wir wie folgt vor:

  • Rufen Siestream() in der Liste auf

  • Rufen Sie diefilter()-Methode mit einem richtigenPredicate auf

  • Rufen Sie dasfindAny() -Sconstruct auf, dasthe first element that matches the filter predicate wrapped in an Optional zurückgibt, wenn ein solches Element vorhanden ist **

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

Der Einfachheit halber verwenden wir standardmäßignull, fallsOptional leer ist. Dies ist jedoch möglicherweise nicht immer die beste Wahl für jedes Szenario.

4. Bibliotheken von Drittanbietern

Nun, während die Stream-API mehr als ausreichend ist, istwhat should we do if we’re stuck on an earlier version of Java?

Glücklicherweise gibt es viele Bibliotheken von Drittanbietern wie Google Guava und Apache Commons, die wir verwenden können.

4.1. Google Guava

Google Guava bietet ähnliche Funktionen wie Streams:

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

Wie bei der API vonStreamkönnen wir optional einen Standardwert anstelle vonnull zurückgeben:

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

Der obige Code wählt das erste Element in der Liste aus, wenn keine Übereinstimmung gefunden wird.

Und vergessen Sie nicht, dass GuavaNullPointerException auslöst, wenn entweder die Liste oder das Prädikatnull ist.

4.2. Apache Commons

Mit Apache Commons können wir ein Element fast genauso finden:

Customer james = IterableUtils.find(customers,
  new Predicate() {
      public boolean evaluate(Customer customer) {
          return "James".equals(customer.getName());
      }
  });

Es gibt jedoch einige wichtige Unterschiede:

  1. Apache Commons gibt nurnull zurück, wenn wir einenull-Liste übergeben

  2.  bietet keine Standardwertfunktionalität wie GuavastryFind

5. Fazit

In diesem Artikel haben wir verschiedene Methoden zum Auffinden eines Elements inList, skennengelernt, beginnend mit schnellen Existenzprüfungen und endend mit feldbasierten Suchen.

Wir haben uns auch die Drittanbieter-BibliothekenGoogle Guava undApache Commons als Alternativen zur Java 8Streams-API angesehen.

Vielen Dank für Ihren Besuch und denken Sie daran, die gesamte Quelle für diese Beispieleover on GitHub. zu überprüfen