Saya tahu ini adalah utas lama, tetapi tidak ada jawaban lain yang sepenuhnya memecahkan kasus penggunaan saya (saya kira Guava Multiset mungkin melakukan hal yang sama, tetapi tidak ada contoh di sini). Maafkan pemformatan saya. Saya masih baru untuk memposting di stack stack. Selain itu beri tahu saya jika ada kesalahan
Katakanlah Anda memiliki List<T>
a dan List<T>
b dan Anda ingin memeriksa apakah mereka sama dengan kondisi berikut:
1) O (n) waktu berjalan yang diharapkan
2) Kesetaraan didefinisikan sebagai: Untuk semua elemen dalam a atau b, berapa kali elemen terjadi dalam a sama dengan berapa kali elemen tersebut terjadi dalam b. Elemen kesetaraan didefinisikan sebagai 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;
}
Waktu berjalan adalah O (n) karena kita melakukan penyisipan O (2 * n) ke dalam hashmap dan O (3 * n) memilih hashmap. Saya belum sepenuhnya menguji kode ini, jadi waspadalah :)
//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);