Sé que este es un hilo viejo, pero ninguna de las otras respuestas resolvió por completo mi caso de uso (supongo que Guava Multiset podría hacer lo mismo, pero no hay ningún ejemplo aquí). Por favor disculpe mi formateo. Todavía soy nuevo en publicar en el intercambio de pila. Además, avíseme si hay algún error
Digamos que tiene List<T>
una y List<T>
b y desea comprobar si son iguales, con las siguientes condiciones:
1) O (n) tiempo de ejecución esperado
2) La igualdad se define como: Para todos los elementos en aob, el número de veces que el elemento ocurre en a es igual al número de veces que el elemento ocurre en b. La igualdad de elementos se define 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;
}
El tiempo de ejecución es O (n) porque estamos haciendo O (2 * n) inserciones en un hashmap y O (3 * n) selecciones de hashmap. No he probado completamente este código, así que ten 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);