2015-03-26 9 views
8

Sto provando a determinare se tutti gli elementi di un elenco sono uguali. come ad esempio:Tutti gli elementi determinano Java sono uguali in un elenco

(10,10,10,10,10) --> true 
(10,10,20,30,30) --> false 

so hashset potrebbe essere utile, ma non so come scrivere in java.

questo è quello che ho provato, ma non ha funzionato:

public static boolean allElementsTheSame(List<String> templist) 
{ 

    boolean flag = true; 
    String first = templist.get(0); 

    for (int i = 1; i< templist.size() && flag; i++) 
    { 
     if(templist.get(i) != first) flag = false; 
    } 

    return true; 
} 
+3

suggerisco ci mostri il codice Java che avete già provato. –

+0

se tutti gli elementi sono uguali, devono essere tutti uguali al primo elemento (a meno che l'elenco non sia vuoto) ... basta iterare e controllarlo – sodik

+2

Hai bisogno di 'return flag; 'nel tuo codice per lo meno. –

risposta

28

Utilizzando l'API Stream (Java 8+)

boolean allEqual = list.stream().distinct().limit(2).count() <= 1 

o

boolean allEqual = list.isEmpty() || list.stream().allMatch(list.get(0)::equals); 

Utilizzo di Set:

boolean allEqual = new HashSet<String>(tempList).size() <= 1; 

Utilizzando un ciclo:

boolean allEqual = true; 
for (String s : list) { 
    if(!s.equals(list.get(0))) 
     allEqual = false; 
} 

Problemi con il codice di OP

Due problemi con il codice:

  • Dal momento che si sta confrontando String s tu s utilizzare !templist.get(i).equals(first) anziché !=.

  • Hai return true; mentre dovrebbe essere return flag;

A parte questo, l'algoritmo è suono, ma si potrebbe ottenere via senza il flag facendo:

String first = templist.get(0); 
for (int i = 1; i < templist.size(); i++) { 
    if(!templist.get(i).equals(first)) 
     return false; 
} 
return true; 

O anche

String first = templist.get(0); 
for (String s : templist) { 
    if(!s.equals(first)) 
     return false; 
} 
return true; 
+1

Mi chiedo se 'limit (2)' aggiunga davvero l'efficienza qui. –

+3

@ PM77-1, per una lista di '(1, 2, 3, 4, 5)', il 'limite (2)' farà in modo che termini presto dopo '(1, 2)'. – aioobe

+0

Lo capisco. La domanda è se 'count()' è abbastanza costoso da superare il sovraccarico dell'operazione extra. –

1

Questo è un grande caso d'uso per il metodo Stream.allMatch():

booleano allmatch (predicato predicato)

Indica se tutti gli elementi di questa corrente corrispondono il predicato fornito.

Si possono anche fare il vostro metodo generico, quindi può essere utilizzato con le liste di qualsiasi tipo:

static boolean allElementsTheSame(List<?> templist) { 
    return templist.stream().allMatch(e -> e.equals(templist.get(0))); 
} 
+0

Perché l'intera istruzione' if'? Solo la seconda dichiarazione di ritorno dovrebbe farmi credere. – aioobe

+0

Sì, hai ragione. Stavo cercando di evitare un 'IndexOutOfBoundsException' su' get (0) ', ma vedo che non accadrebbe come' get (0) 'non verrà eseguito quando la lista è vuota. Ho aggiornato la risposta. Grazie per averlo notato. –

2

La frequenza di un valore in un elenco sarà la stessa della dimensione della lista .

boolean allEqual = Collections.frequency(templist, list.get(0)) == templist.size()

Problemi correlati