Wiem, że to stary wątek, ale żadna z pozostałych odpowiedzi nie rozwiązała w pełni mojego przypadku użycia (wydaje mi się, że Guava Multiset może zrobić to samo, ale nie ma tutaj żadnego przykładu). Przepraszam za moje formatowanie. Nadal jestem nowy w publikowaniu na stosie wymiany. Dodatkowo daj mi znać, jeśli są jakieś błędy
Powiedzmy, że masz List<T>
a i List<T>
b i chcesz sprawdzić, czy są one równe z następujących warunków:
1) O (n) oczekiwany czas działania
2) Równość jest zdefiniowana jako: Dla wszystkich elementów w a lub b liczba wystąpień elementu w a jest równa liczbie wystąpień elementu w b. Równość elementów jest zdefiniowana jako 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;
}
Czas działania to O (n), ponieważ wykonujemy wstawiania O (2 * n) do mapy skrótów i zaznaczanie mapy skrótów O (3 * n) wybiera. Nie w pełni przetestowałem ten kod, więc uważaj :)
//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);