Sei que esse é um encadeamento antigo, mas nenhuma das outras respostas resolveu completamente meu caso de uso (acho que o Guava Multiset pode fazer o mesmo, mas não há exemplo aqui). Por favor, desculpe minha formatação. Ainda sou novo em postar na troca de pilhas. Além disso, deixe-me saber se há algum erro
Vamos dizer que você tem List<T>
um e List<T>
b e quiser verificar se eles são iguais com as seguintes condições:
1) O (n) tempo de execução esperado
2) Igualdade é definida como: Para todos os elementos em a ou b, o número de vezes que o elemento ocorre em a é igual ao número de vezes que o elemento ocorre em b. Igualdade de elementos é definida como 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;
}
O tempo de execução é O (n) porque estamos fazendo inserções O (2 * n) em um mapa de hash e O (3 * n) seleciona o hashmap. Eu não testei completamente esse código, então cuidado :)
//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);