Bu eski bir iş parçacığı olduğunu biliyorum, ama diğer cevapların hiçbiri benim kullanım davasını tamamen çözdü (Guava Multiset aynı şeyi yapabilir, ama burada bir örnek yok). Lütfen biçimlendirmemi affedin. Hala yığın borsasında yayınlama konusunda yeniyim. Ayrıca herhangi bir hata olup olmadığını bana bildirin
Diyelim ki List<T>
a ve List<T>
b'ye sahip olduğunuzu ve bunların aşağıdaki koşullara eşit olup olmadığını kontrol etmek istediğinizi varsayalım:
1) O (n) beklenen çalışma süresi
2) Eşitlik şu şekilde tanımlanır: a veya b'deki tüm öğeler için, öğenin a'da meydana gelme sayısı, öğenin b'de gerçekleşme sayısına eşittir. Eleman eşitliği T.equals () olarak tanımlanır
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;
}
Çalışma süresi O (n) 'dir çünkü bir hashmap içine O (2 * n) yerleştirmeler yapıyoruz ve O (3 * n) hashmap seçimleri yapıyoruz. Bu kodu tamamen test etmedim, bu yüzden dikkatli olun :)
//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);