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;
}
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 String
s, 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;
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()
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)));
}