Я знаю, что это старая ветка, но ни один из других ответов полностью не решил мой вариант использования (я думаю, что 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) вставки в hashmap и O (3 * n) выбирает hashmap. Я не полностью протестировал этот код, так что будьте осторожны :)
//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);