私はこれが古いスレッドであることを知っていますが、他のどの回答も私のユースケースを完全に解決しませんでした(Guava Multisetでも同じことができると思いますが、ここには例はありません)。申し訳ありませんがフォーマットしてください。私はまだスタック交換に投稿するのは初めてです。さらに、エラーがある場合はお知らせください
あなたが持ってList<T>
いるとしましょう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(2 * n)挿入とO(3 * n)ハッシュマップ選択を実行しているため、実行時間はO(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);