Bepaal of alle elementen hetzelfde zijn in een Java-lijst

1. Overzicht

In deze korte tutorial leren we hoe we kunnen bepalen of alle elementen in een Lijst zijn hetzelfde.

We zullen ook kijken naar de tijdcomplexiteit van elke oplossing met behulp van de Big O-notatie, waardoor we het worstcasescenario krijgen.

2. Voorbeeld

Stel dat we de volgende drie lijsten hebben:

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

Het is onze taak om verschillende oplossingen voor te stellen die terugkeren waar alleen voor emptyList en allEqualList.

3. Basis looping

Ten eerste is het waar dat alle elementen om gelijk te zijn, ze allemaal gelijk moeten zijn aan het eerste element. Laten we daar in een lus van profiteren:

openbare boolean verifyAllEqualUsingALoop (Lijstlijst) {for (String s: list) {if (! s.equals (list.get (0))) return false; } retourneren waar; }

Dit is leuk omdat, terwijl de tijd complexiteit is Aan), kan het vaak vroeg stoppen.

4. HashSet

We kunnen ook een HashSet omdat al zijn elementen verschillend zijn. ikf we converteren a Lijst naar een HashSet en de resulterende grootte is kleiner dan of gelijk aan 1, dan weten we dat alle elementen in de lijst gelijk zijn:

openbare boolean verifyAllEqualUsingHashSet (lijstlijst) {retourneer nieuwe HashSet (lijst) .size () <= 1; }

Omzetten van een Lijst naar HashSet kosten Aan) tijd tijdens het bellen grootte neemt O (1). We hebben dus nog steeds een totale tijdcomplexiteit van Aan).

5. Collecties API

Een andere oplossing is om de frequentie (Collectie c, Object o) methode van de Collections API. Deze methode retourneert het aantal elementen in een Collectie c overeenkomend met een Object o.

Dus als het frequentieresultaat gelijk is aan de grootte van de lijst, weten we dat alle elementen gelijk zijn:

openbare boolean verifyAllEqualUsingFrequency (lijstlijst) return list.isEmpty () 

Net als bij de vorige oplossingen is de tijdcomplexiteit Aan) sinds intern, Collections.frequency () gebruikt basislussen.

6. Streams

De Stroom API in Java 8 geeft ons nog meer alternatieve manieren om te detecteren of alle items in een lijst gelijk zijn.

6.1. onderscheiden ()

Laten we eens kijken naar een bepaalde oplossing door gebruik te maken van de onderscheiden () methode.

Om te controleren of alle elementen in een lijst gelijk zijn, we tellen de verschillende elementen van zijn stroom:

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

Als de telling van deze stream kleiner of gelijk is aan 1, dan zijn alle elementen gelijk en keren we terug waar.

De totale kosten van de operatie zijn Aan), dat is de tijd die nodig is om alle stroomelementen te doorlopen.

6.2. allMatch ()

De Stroom API's allMatch () methode biedt een perfecte oplossing om te bepalen of alle elementen van deze stream overeenkomen met het opgegeven predikaat:

openbare boolean verifyAllEqualAnotherUsingStream (lijstlijst) return list.isEmpty () 

Net als bij het vorige voorbeeld met streams, heeft deze een Aan) tijdcomplexiteit, dat is de tijd om de hele stroom te doorkruisen.

7. Bibliotheken van derden

Als we vastzitten aan een eerdere versie van Java en de Stream API niet kunnen gebruiken, we kunnen gebruik maken van bibliotheken van derden, zoals Google Guava en Apache Commons.

Hier hebben we twee oplossingen die erg op elkaar lijken, door een lijst met elementen te herhalen en deze te matchen met het eerste element. We kunnen dus gemakkelijk de te zijn tijdscomplexiteit berekenen Aan).

7.1. Afhankelijkheden van Maven

Om een ​​van beide te gebruiken, kunnen we beide toevoegen guave of commons-collecties4 respectievelijk aan ons project:

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

7.2. Google Guava

In Google Guava, de statische methode Iterables.all () geeft terug waar als alle elementen in de lijst voldoen aan het predikaat:

openbare boolean verifyAllEqualUsingGuava (lijstlijst) {return Iterables.all (lijst, nieuw predicaat () {openbare booleaanse toepassing (String s) {return s.equals (list.get (0));}}); }

7.3. Apache Commons

Evenzo is het Apache Commons bibliotheek biedt ook een hulpprogramma-klasse IterableUtils met een reeks statische hulpprogramma-methoden om op te werken Herhaalbaar gevallen.

Met name de statische methode IterableUtils.matchesAll () geeft terug waar als alle elementen in de lijst voldoen aan het predikaat:

openbare boolean verifyAllEqualUsingApacheCommon (lijstlijst) {return IterableUtils.matchesAll (lijst, nieuwe org.apache.commons.collections4.Predicate () {openbare boolean (String s) {return s.equals (list.get (0));} }); } 

8. Conclusie

In dit artikel hebben we verschillende manieren geleerd om te controleren of alle elementen in een Lijst zijn gelijk te beginnen met eenvoudige Java-functionaliteit en vervolgens alternatieve manieren te tonen met behulp van de Stroom API en de bibliotheken van derden Google Guava en Apache Commons.

We hebben ook geleerd dat elk van de oplossingen ons dezelfde tijdcomplexiteit geeft van Aan). Het is echter aan ons om de beste te kiezen op basis van hoe en waar deze zal worden gebruikt.

En zorg ervoor dat je de volledige set voorbeelden bekijkt op GitHub.