2015-03-26 3 views
8

Ich versuche zu bestimmen, ob alle Elemente in einer Liste identisch sind. wie:Java alle bestimmen Elemente sind die gleichen in einer Liste

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

Ich weiß Hashset hilfreich sein könnte, aber ich weiß nicht, wie in Java zu schreiben.

das ist das, was ich versucht habe, aber hat nicht funktioniert:

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

Ich schlage vor, Sie zeigen uns den Java Code, den Sie bereits versucht haben. –

+0

Wenn alle Elemente gleich sind, müssen sie alle gleich dem ersten Element sein (es sei denn, die Liste ist leer) ... iterieren Sie einfach und überprüfen Sie es. – sodik

+2

Sie benötigen 'return flag;' in Ihrem Code mindestens. –

Antwort

28

den Stream-API verwenden (Java 8+)

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

oder

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

Mit einem Set:

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

Mit einer Schleife:

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

Probleme mit OP Code

Zwei Probleme mit Ihrem Code:

  • Da Sie vergleichen String s du bist es Verwenden Sie bitte !templist.get(i).equals(first) anstelle von !=.

  • Sie haben return true; während es return flag;

Abgesehen davon sein sollte, Ihr Algorithmus ist solide, aber man konnte ohne flag weg, indem Sie:

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

Oder sogar

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

Ich frage mich, ob 'Limit (2)' wirklich die Effizienz hier hinzufügt. –

+3

@ PM77-1, für eine Liste von '(1, 2, 3, 4, 5)', wird '' limit (2) 'sicherstellen, dass es früh nach' (1, 2) 'endet. – aioobe

+0

Ich verstehe das. Die Frage ist, ob 'count()' teuer genug ist, um den Overhead der zusätzlichen Operation zu kompensieren. –

1

Dies ist ein großer Anwendungsfall für die Stream.allMatch() Methode:

boolean allmatch (Prädikat Prädikat)

Gibt an, ob alle Elemente dieses Stroms das bereitgestellten Prädikat entsprechen.

Sie können sogar Ihre Methode generisch machen, so kann es mit Listen jeder Art verwendet werden:

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

Warum die ganze' if'-Anweisung? Nur die zweite Rückmeldung sollte ich glauben. – aioobe

+0

Ja, Sie haben Recht. Ich habe versucht, eine 'IndexOutOfBoundsException' auf' get (0) 'zu verhindern, aber ich sehe, dass es nicht passieren würde, da' get (0) 'nicht ausgeführt wird, wenn die Liste leer ist. Ich habe die Antwort aktualisiert. Danke, dass du es bemerkt hast. –

2

Die Häufigkeit eines Wertes in einer Liste wird das gleiche wie die Größe der Liste sein .

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