Я знаю, що це стара тема, але жодна з інших відповідей повністю не вирішила мій варіант використання (я думаю, Guava Multiset може зробити те саме, але прикладу тут немає). Вибачте, будь ласка, про моє форматування. Я все ще нова в публікаціях на обміні стеками. Додатково повідомте мене, якщо є якісь помилки
Скажімо, у вас є List<T>
a і List<T>
b, і ви хочете перевірити, чи вони рівні з такими умовами:
1) O (n) очікуваний час виконання
2) Рівність визначається як: Для всіх елементів у a або b кількість разів, коли елемент виникає в a, дорівнює кількості разів, коли елемент виникає в b. Рівність елементів визначається як 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 (n), оскільки ми робимо вставки O (2 * n) у хешмап і вибираємо хешмап O (3 * n). Я не повністю перевірив цей код, тому будьте уважні :)
//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);