So che questo è un vecchio thread, ma nessuna delle altre risposte ha risolto completamente il mio caso d'uso (suppongo che Guava Multiset potrebbe fare lo stesso, ma qui non c'è alcun esempio). Mi scusi per la mia formattazione. Sono ancora nuovo a pubblicare post sullo scambio di stack. Fammi sapere se ci sono errori
Diciamo che hai List<T>
a e List<T>
b e vuoi verificare se sono uguali alle seguenti condizioni:
1) O (n) tempo di esecuzione previsto
2) L'uguaglianza è definita come: Per tutti gli elementi in a o b, il numero di volte in cui l'elemento si presenta in è uguale al numero di volte in cui si verifica l'elemento in b. L'uguaglianza degli elementi è definita come 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;
}
Il tempo di esecuzione è O (n) perché stiamo eseguendo inserimenti O (2 * n) in una hashmap e O (3 * n) seleziona hashmap. Non ho testato completamente questo codice, quindi attenzione :)
//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);