web-dev-qa-db-fra.com

Java tous les éléments de détermination sont les mêmes dans une liste

J'essaie de déterminer si tous les éléments d'une liste sont identiques. tel que:

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

Je sais que le hachage peut être utile, mais je ne sais pas comment écrire en Java.

c'est celui que j'ai essayé, mais qui n'a pas fonctionné:

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;
}
25
Colin Zhong

tilisation de l'API Stream (Java 8 +)

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

ou

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

en utilisant un Set:

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

en utilisant une boucle:

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

Problèmes avec le code OP

Deux problèmes avec votre code:

  • Puisque vous comparez Strings, vous devez utiliser !templist.get(i).equals(first) au lieu de !=.

  • Vous avez return true; Alors qu'il devrait être return flag;

En dehors de cela, votre algorithme est solide, mais vous pourriez vous en sortir sans flag en faisant:

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

Ou même

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

La fréquence d'une valeur dans une liste sera la même que la taille de la liste.

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

5
darrenp

C'est un excellent cas d'utilisation pour la méthode Stream.allMatch():

boolean allMatch (prédicat prédicat)

Renvoie si tous les éléments de ce flux correspondent au prédicat fourni.

Vous pouvez même rendre votre méthode générique, afin qu'elle puisse être utilisée avec des listes de tout type:

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