Határozza meg, hogy minden elem egyezik-e egy Java-listában

1. Áttekintés

Ebben a gyors bemutatóban megtudhatjuk, hogyan lehet meghatározni, hogy az a Lista ugyanazok.

Ezenkívül megvizsgáljuk az egyes megoldások időbeli összetettségét a Big O jelöléssel, a legrosszabb esetet adva.

2. Példa

Tegyük fel, hogy a következő 3 listánk van:

notAllEqualList = Arrays.asList ("Jack", "James", "Sam", "James"); emptyList = Tömbök.asList (); allEqualList = Arrays.asList ("Jack", "Jack", "Jack", "Jack");

Feladatunk különböző megoldásokat javasolni, amelyek visszatérnek igaz Csak emptyList és allEqualList.

3. Alap hurok

Először is igaz, hogy ahhoz, hogy minden elem egyenlő legyen, mindegyiknek meg kell egyeznie az elsővel. Használjuk ki ezt ciklusban:

nyilvános logikai igazolásAllEqualUsingALoop (List list) {for (String s: list) {if (! s.equals (list.get (0))) false értéket ad vissza; } return true; }

Ez azért szép, mert miközben az idő összetettsége igen Tovább), gyakran korán kiléphet.

4. HashSet

Használhatjuk a HashSet mivel minden eleme különálló. énf átalakítjuk a Lista a HashSet és az így kapott méret kisebb vagy egyenlő, mint 1, akkor tudjuk, hogy a lista összes eleme egyenlő:

nyilvános logikai igazolásAllEqualUsingHashSet (List list) {return new HashSet (list) .size () <= 1; }

Konvertálás a Lista nak nek HashSet költségek Tovább) idő hívás közben méret veszi O (1). Így még mindig teljes időbeli összetettségünk van Tovább).

5. Gyűjtemények API

Egy másik megoldás a frekvencia (c gyűjtemény, o objektum) a Collections API metódusa. Ez a módszer visszaadja az a elemek számát Gyűjtemény c illeszkedő an Tárgy o.

Tehát, ha a gyakorisági eredmény megegyezik a lista méretével, tudjuk, hogy az összes elem egyenlő:

nyilvános logikai értékellenőrzésAllEqualUsingFrequency (List list) return list.isEmpty () 

A korábbi megoldásokhoz hasonlóan az idő bonyolultsága is Tovább) mivel belsőleg, Gyűjtemények.frekvencia () alapvető hurokzást használ.

6. Patakok

A Folyam Az API a Java 8-ban még több alternatív módot kínál arra, hogy felismerjük, hogy a listában szereplő összes elem egyenlő-e.

6.1. különböző()

Nézzünk meg egy konkrét megoldást a különböző() módszer.

Annak ellenőrzéséhez, hogy a lista összes eleme megegyezik-e, megszámoljuk a patak különálló elemeit:

nyilvános logikai igazolásAllEqualUsingStream (List list) {return list.stream () .distinct () .count () <= 1; }

Ha ennek a folyamnak a száma kisebb vagy egyenlő 1-vel, akkor az összes elem egyenlő és visszatérünk igaz.

A művelet teljes költsége Tovább), amely az az idő, amely az összes adatfolyam átfutásához szükséges.

6.2. allMatch ()

A Folyam API-k allMatch () A módszer tökéletes megoldást kínál annak megállapítására, hogy a folyam összes eleme megfelel-e a megadott állítmánynak:

nyilvános logikai értékellenőrzésAllEqualAnotherUsingStream (List list) return list.isEmpty () 

Az előző, patakokat használó példához hasonlóan, ennek is van egy Tovább) az idő bonyolultsága, amely az az idő, amikor át kell járni az egész folyamot.

7. Harmadik fél könyvtárai

Ha elakadtunk a Java korábbi verzióiban, és nem tudjuk használni a Stream API-t, felhasználhatunk harmadik fél könyvtárait, mint pl Google Guava és Apache Commons.

Itt két megoldásunk van, amelyek nagyon hasonlóak, az elemek listáján végigvezetve az első elemhez illesztjük. Így könnyen kiszámíthatjuk az idő bonyolultságát Tovább).

7.1. Maven-függőségek

Bármelyik használatához bármelyiket hozzáadhatjuk gujávafa vagy commons-gyűjtemények4 projektünkhöz:

 com.google.guava guava 23.0 
     org.apache.commons commons-gyűjtemények4 4.1 

7.2. Google Guava

Ban ben Google Guava, a statikus módszer Iterables.all () visszatér igaz ha a lista összes eleme megfelel az állítmánynak:

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

7.3. Apache Commons

Hasonlóképpen a Apache Commons könyvtár a közmű osztályt is biztosítja IterableUtils egy statikus segédprogram módszerrel, amelyen működni lehet Iterálható példányok.

Különösen a statikus módszer IterableUtils.matchesAll () visszatér igaz ha a lista összes eleme megfelel az állítmánynak:

nyilvános logikai igazolásAllEqualUsingApacheCommon (Lista lista) {return IterableUtils.matchesAll (lista, új org.apache.commons.collections4.Predicate () {nyilvános logikai érték (String s) {return s.equals (list.get (0));} }); } 

8. Következtetés

Ebben a cikkben különböző módszereket tanultunk meg annak ellenőrzésére, hogy az a Lista egyenlőek, kezdve az egyszerű Java-funkcionalitással, majd bemutatva a Folyam API és harmadik fél könyvtárai Google Guava és Apache Commons.

Megtudtuk azt is, hogy az egyes megoldások ugyanolyan bonyolult időt adnak nekünk Tovább). Azonban rajtunk múlik, hogy a legjobbat válasszuk ki aszerint, hogy hogyan és hol fogjuk használni.

És győződjön meg róla, hogy a teljes mintakészletet megnézte a GitHubon.