我知道这是一个旧线程,但是没有其他答案可以完全解决我的用例(我猜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);