Bestem, om alle elementer er de samme på en Java-liste

1. Oversigt

I denne hurtige vejledning finder vi ud af, hvordan vi kan afgøre, om alle elementerne i a Liste er det samme.

Vi vil også se på tidskompleksiteten for hver løsning ved hjælp af Big O-notation, hvilket giver os det værste tilfælde.

2. Eksempel

Lad os antage, at vi har følgende 3 lister:

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

Vores opgave er at foreslå forskellige løsninger, der vender tilbage rigtigt kun for tomliste og allEqualList.

3. Grundlæggende looping

For det første er det sandt, at for at alle elementer skal være ens, skal de alle være ens med det første element. Lad os drage fordel af det i en løkke:

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

Dette er rart, for mens tidskompleksiteten er På), kan det ofte forlade tidligt.

4. HashSet

Vi kan også bruge en HashSet da alle dets elementer er forskellige. jegf vi konverterer a Liste til en HashSet og den resulterende størrelse er mindre end eller lig med 1, så ved vi, at alle elementer på listen er ens:

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

Konvertering af en Liste til HashSet omkostninger På) tid, mens du ringer størrelse tager O (1). Således har vi stadig en samlet tidskompleksitet på På).

5. Samlinger API

En anden løsning er at bruge frekvens (samling c, objekt o) metode til Collections API. Denne metode returnerer antallet af elementer i en Samling c matchende en Objekt o.

Så hvis frekvensresultatet er lig med størrelsen på listen, ved vi, at alle elementerne er ens:

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

I lighed med de tidligere løsninger er tidskompleksiteten På) siden internt, Collections.frekvens () bruger grundlæggende looping.

6. Strømme

Det Strøm API i Java 8 giver os endnu flere alternative måder at opdage, om alle elementer på en liste er ens.

6.1. tydelig ()

Lad os se på en bestemt løsning, der bruger tydelig () metode.

For at kontrollere, om alle elementerne på en liste er ens, vi tæller de forskellige elementer i dens strøm:

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

Hvis optællingen af ​​denne strøm er mindre eller lig med 1, er alle elementerne ens, og vi vender tilbage rigtigt.

De samlede omkostninger ved operationen er På), det er den tid, det tager at gennemgå alle strømelementerne.

6.2. allMatch ()

Det Strøm API'er allMatch () metoden giver en perfekt løsning til at bestemme, om alle elementer i denne stream matcher det angivne prædikat:

offentlig boolsk verifAllEqualAnotherUsingStream (liste liste) returliste.isEmpty () 

I lighed med det foregående eksempel ved hjælp af streams har denne en På) tidskompleksitet, som er tiden til at krydse hele strømmen.

7. Tredjepartsbiblioteker

Hvis vi sidder fast i en tidligere version af Java og ikke kan bruge Stream API, vi kan gøre brug af tredjepartsbiblioteker som f.eks Google Guava og Apache Commons.

Her har vi to løsninger, der er meget ens, iterere gennem en liste over elementer og matche den med det første element. Således kan vi nemt beregne den tidskompleksitet, der skal være På).

7.1. Maven afhængigheder

For at bruge en af ​​dem kan vi tilføje en af ​​dem guava eller fælles-samlinger4 henholdsvis til vores projekt:

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

7.2. Google Guava

I Google Guava, den statiske metode Iterables.all () vender tilbage rigtigt hvis alle elementer på listen tilfredsstiller prædikatet:

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

Tilsvarende er Apache Commons biblioteket giver også en hjælpeklasse IterableUtils med et sæt statiske hjælpemetoder til at fungere på Iterabel tilfælde.

Især den statiske metode IterableUtils.matchesAll () vender tilbage rigtigt hvis alle elementer på listen tilfredsstiller prædikatet:

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

8. Konklusion

I denne artikel har vi lært forskellige måder at kontrollere, om alle elementer i en Liste er lige startende med enkel Java-funktionalitet og derefter viser alternative måder at bruge Strøm API og tredjepartsbiblioteker Google Guava og Apache Commons.

Vi har også lært, at hver af løsningerne giver os den samme tidskompleksitet som På). Det er dog op til os at vælge den bedste i henhold til hvordan og hvor den skal bruges.

Og sørg for at tjekke det komplette sæt af prøver over på GitHub.


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