Ich weiß, dass dies ein alter Thread ist, aber keine der anderen Antworten hat meinen Anwendungsfall vollständig gelöst (ich denke, Guava Multiset könnte dasselbe tun, aber hier gibt es kein Beispiel). Bitte entschuldigen Sie meine Formatierung. Ich bin noch neu im Stack Exchange. Lassen Sie mich außerdem wissen, wenn Fehler vorliegen
Nehmen wir an, Sie haben List<T>
a und List<T>
b und möchten überprüfen, ob sie den folgenden Bedingungen entsprechen:
1) O (n) erwartete Laufzeit
2) Gleichheit ist definiert als: Für alle Elemente in a oder b ist die Häufigkeit, mit der das Element in a auftritt, gleich der Häufigkeit, mit der das Element in b auftritt. Elementgleichheit ist definiert als 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;
}
Die Laufzeit beträgt O (n), da O (2 * n) in eine Hashmap eingefügt und O (3 * n) ausgewählt wird. Ich habe diesen Code nicht vollständig getestet, also Vorsicht :)
//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);