Determina se tutti gli elementi sono gli stessi in un elenco Java

1. Panoramica

In questo rapido tutorial, scopriremo come determinare se tutti gli elementi in un elenco sono gli stessi.

Esamineremo anche la complessità temporale di ciascuna soluzione utilizzando la notazione Big O, offrendoci lo scenario peggiore.

2. Esempio

Supponiamo di avere le seguenti 3 liste:

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

Il nostro compito è proporre diverse soluzioni che restituiscano true solo per emptyList e allEqualList .

3. Looping di base

Innanzitutto, è vero che affinché tutti gli elementi siano uguali, devono essere tutti uguali al primo elemento. Approfittiamone in un ciclo:

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

Questo è utile perché, sebbene la complessità temporale sia O (n) , spesso può uscire presto.

4. HashSet

Possiamo anche usare un HashSet poiché tutti i suoi elementi sono distinti. Se convertiamo un List in un HashSet e la dimensione risultante è minore o uguale a 1, allora sappiamo che tutti gli elementi nella lista sono uguali:

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

La conversione di un elenco in HashSet costa O (n) tempo mentre la dimensione della chiamata richiede O (1) . Quindi, abbiamo ancora una complessità temporale totale di O (n) .

5. API delle collezioni

Un'altra soluzione è utilizzare il metodo frequency (Collection c, Object o) dell'API Collections. Questo metodo restituisce il numero di elementi in una Collection c che corrispondono a un Object o .

Quindi, se il risultato della frequenza è uguale alla dimensione della lista, sappiamo che tutti gli elementi sono uguali:

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

Simile alle soluzioni precedenti, la complessità temporale è O (n) poiché internamente, Collections.frequency () utilizza il ciclo di base.

6. Flussi

L' API Stream in Java 8 ci offre ancora più modi alternativi per rilevare se tutti gli elementi in un elenco sono uguali.

6.1. distinto ()

Diamo un'occhiata a una particolare soluzione che utilizza il metodo separate () .

Per verificare se tutti gli elementi in un elenco sono uguali, contiamo gli elementi distinti del suo flusso:

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

Se il conteggio di questo flusso è minore o uguale a 1, tutti gli elementi sono uguali e restituiamo true .

Il costo totale dell'operazione è O (n), che è il tempo impiegato per passare attraverso tutti gli elementi del flusso.

6.2. allMatch ()

Il metodo allMatch () dell'API Stream fornisce una soluzione perfetta per determinare se tutti gli elementi di questo flusso corrispondono al predicato fornito:

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

Simile all'esempio precedente che utilizza i flussi, questo ha una complessità temporale O (n) , che è il tempo per attraversare l'intero flusso.

7. Biblioteche di terze parti

Se siamo bloccati su una versione precedente di Java e non possiamo utilizzare l'API Stream, possiamo utilizzare librerie di terze parti come Google Guava e Apache Commons .

Qui abbiamo due soluzioni che sono molto simili, iterando un elenco di elementi e abbinandolo al primo elemento. Quindi, possiamo facilmente calcolare la complessità temporale come O (n) .

7.1. Dipendenze di Maven

Per utilizzarli, possiamo aggiungere rispettivamente guava o commons-collections4 al nostro progetto:

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

7.2. Google Guava

In Google Guava , il metodo statico Iterables.all () restituisce true se tutti gli elementi nell'elenco soddisfano il predicato:

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

Allo stesso modo, la libreria Apache Commons fornisce anche una classe di utilità IterableUtils con una serie di metodi di utilità statici per operare su istanze Iterable .

In particolare, il metodo statico IterableUtils.matchesAll () restituisce true se tutti gli elementi nell'elenco soddisfano il predicato:

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. Conclusione

In questo articolo, abbiamo appreso diversi modi per verificare se tutti gli elementi in un elenco sono uguali iniziando con una semplice funzionalità Java e quindi mostrando modi alternativi utilizzando l' API Stream e le librerie di terze parti Google Guava e Apache Commons.

Abbiamo anche imparato che ciascuna delle soluzioni ci dà la stessa complessità temporale di O (n) . Sta comunque a noi scegliere il migliore in base a come e dove verrà utilizzato.

E assicurati di controllare il set completo di campioni su GitHub.