Stellen Sie fest, ob alle Elemente in einer Java-Liste gleich sind

1. Übersicht

In diesem kurzen Tutorial erfahren Sie, wie Sie feststellen können, ob alle Elemente in einer Liste gleich sind.

Wir werden auch die zeitliche Komplexität jeder Lösung mithilfe der Big O-Notation untersuchen, um das Worst-Case-Szenario zu erhalten.

2. Beispiel

Nehmen wir an, wir haben die folgenden 3 Listen:

notAllEqualList = Arrays.asList("Jack", "James", "Sam", "James"); emptyList = Arrays.asList(); allEqualList = Arrays.asList("Jack", "Jack", "Jack", "Jack");

Unsere Aufgabe ist es unterschiedliche Lösungen vorzuschlagen , die Rückkehr wahr nur für emptyList und allEqualList .

3. Grundlegendes Looping

Erstens ist es wahr, dass alle Elemente, um gleich zu sein, alle gleich dem ersten Element sein müssen. Nutzen wir das in einer Schleife:

public boolean verifyAllEqualUsingALoop(List list) { for (String s : list) { if (!s.equals(list.get(0))) return false; } return true; }

Dies ist schön, da die zeitliche Komplexität zwar O (n) beträgt , sie jedoch häufig vorzeitig beendet wird.

4. HashSet

Wir können auch ein HashSet verwenden, da alle seine Elemente unterschiedlich sind. Ich f wir wandeln eine Liste auf ein HashSet und die resultierende Größe kleiner als oder gleich 1, dann wissen wir , dass alle Elemente in der Liste gleich sind:

public boolean verifyAllEqualUsingHashSet(List list) { return new HashSet(list).size() <= 1; }

Konvertieren eine Liste zu HashSet Kosten O (n) Zeit beim Telefonieren Größe nimmt O (1) . Somit haben wir immer noch eine Gesamtzeitkomplexität von O (n) .

5. Sammlungs- API

Eine andere Lösung besteht darin, die Frequenzmethode (Sammlung c, Objekt o) der Sammlungs-API zu verwenden. Diese Methode gibt die Anzahl der Elemente in einer Sammlung zurück, die mit einem Objekt übereinstimmen .

Wenn also das Frequenzergebnis der Größe der Liste entspricht, wissen wir, dass alle Elemente gleich sind:

public boolean verifyAllEqualUsingFrequency(List list)  return list.isEmpty() 

Ähnlich wie bei den vorherigen Lösungen beträgt die Zeitkomplexität O (n), da Collections.frequency () intern eine grundlegende Schleife verwendet.

6. Streams

Die Stream- API in Java 8 bietet noch mehr alternative Möglichkeiten, um festzustellen, ob alle Elemente in einer Liste gleich sind.

6.1. deutlich ()

Schauen wir uns eine bestimmte Lösung an, die die Methode different () verwendet.

Um zu überprüfen, ob alle Elemente in einer Liste gleich sind, zählen wir die verschiedenen Elemente des Streams:

public boolean verifyAllEqualUsingStream(List list) { return list.stream() .distinct() .count() <= 1; }

Wenn die Anzahl dieses Streams kleiner oder gleich 1 ist, sind alle Elemente gleich und wir geben true zurück .

Die Gesamtkosten der Operation betragen O (n). Dies ist die Zeit, die benötigt wird, um alle Stream-Elemente zu durchlaufen.

6.2. allMatch ()

Die allMatch () -Methode der Stream- API bietet eine perfekte Lösung, um festzustellen, ob alle Elemente dieses Streams mit dem angegebenen Prädikat übereinstimmen:

public boolean verifyAllEqualAnotherUsingStream(List list)  return list.isEmpty() 

Ähnlich wie im vorherigen Beispiel mit Streams hat dieses eine O (n) -Zeitkomplexität, dh die Zeit, um den gesamten Stream zu durchlaufen.

7. Bibliotheken von Drittanbietern

Wenn wir an einer früheren Version von Java festhalten und die Stream-API nicht verwenden können, können wir Bibliotheken von Drittanbietern wie Google Guava und Apache Commons verwenden .

Hier haben wir zwei sehr ähnliche Lösungen, die eine Liste von Elementen durchlaufen und mit dem ersten Element abgleichen. Somit können wir die Zeitkomplexität leicht als O (n) berechnen .

7.1. Maven-Abhängigkeiten

Um beides zu verwenden, können wir unserem Projekt entweder Guave oder Commons-Sammlungen4 hinzufügen :

 com.google.guava guava 23.0 
     org.apache.commons     commons-collections4     4.1 

7.2. Google Guava

In Google Guava gibt die statische Methode Iterables.all () true zurück , wenn alle Elemente in der Liste das Prädikat erfüllen:

public boolean verifyAllEqualUsingGuava(List list) { return Iterables.all(list, new Predicate() { public boolean apply(String s) { return s.equals(list.get(0)); } }); }

7.3. Apache Commons

In ähnlicher Weise bietet die Apache Commons- Bibliothek auch eine Dienstprogrammklasse IterableUtils mit einer Reihe statischer Dienstprogrammmethoden für Iterable- Instanzen.

Insbesondere gibt die statische Methode IterableUtils.matchesAll () true zurück , wenn alle Elemente in der Liste das Prädikat erfüllen:

public boolean verifyAllEqualUsingApacheCommon(List list) { return IterableUtils.matchesAll(list, new org.apache.commons.collections4.Predicate() { public boolean evaluate(String s) { return s.equals(list.get(0)); } }); } 

8. Fazit

In diesem Artikel haben wir verschiedene Methoden kennengelernt, um zu überprüfen, ob alle Elemente in einer Liste gleich sind. Beginnen Sie mit einfachen Java-Funktionen und zeigen Sie mithilfe der Stream- API und der Bibliotheken von Drittanbietern, Google Guava und Apache Commons , alternative Möglichkeiten auf .

Wir haben auch gelernt, dass jede der Lösungen die gleiche zeitliche Komplexität von O (n) ergibt . Es liegt jedoch an uns, die beste auszuwählen, je nachdem, wie und wo sie verwendet wird.

Schauen Sie sich auch die vollständigen Beispiele auf GitHub an.