Je sais que c'est un vieux fil, mais aucune des autres réponses n'a complètement résolu mon cas d'utilisation (je suppose que Guava Multiset pourrait faire la même chose, mais il n'y a pas d'exemple ici). Veuillez excuser ma mise en forme. Je suis encore nouveau pour poster sur l'échange de pile. De plus, faites-moi savoir s'il y a des erreurs
Disons que vous avez List<T>
a et List<T>
b et que vous voulez vérifier s'ils sont égaux aux conditions suivantes:
1) O (n) durée de fonctionnement attendue
2) L'égalité est définie comme: Pour tous les éléments dans a ou b, le nombre de fois où l'élément apparaît dans a est égal au nombre de fois où l'élément apparaît dans b. L'égalité des éléments est définie par T.equals ()
private boolean listsAreEquivelent(List<? extends Object> a, List<? extends Object> b) {
if(a==null) {
if(b==null) {
//Here 2 null lists are equivelent. You may want to change this.
return true;
} else {
return false;
}
}
if(b==null) {
return false;
}
Map<Object, Integer> tempMap = new HashMap<>();
for(Object element : a) {
Integer currentCount = tempMap.get(element);
if(currentCount == null) {
tempMap.put(element, 1);
} else {
tempMap.put(element, currentCount+1);
}
}
for(Object element : b) {
Integer currentCount = tempMap.get(element);
if(currentCount == null) {
return false;
} else {
tempMap.put(element, currentCount-1);
}
}
for(Integer count : tempMap.values()) {
if(count != 0) {
return false;
}
}
return true;
}
Le temps d'exécution est O (n) car nous effectuons des insertions O (2 * n) dans une table de hachage et des sélections de table de hachage O (3 * n). Je n'ai pas entièrement testé ce code, alors attention :)
//Returns true:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","A"));
listsAreEquivelent(null,null);
//Returns false:
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("B","A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),Arrays.asList("A","B"));
listsAreEquivelent(Arrays.asList("A","A","B"),null);