Tôi biết đây là một chủ đề cũ, nhưng không có câu trả lời nào khác giải quyết hoàn toàn trường hợp sử dụng của tôi (tôi đoán Guava Multiset có thể làm tương tự, nhưng không có ví dụ nào ở đây). Xin thứ lỗi cho định dạng của tôi. Tôi vẫn còn mới để đăng trên stack trao đổi. Ngoài ra, hãy cho tôi biết nếu có bất kỳ lỗi nào
Hãy nói rằng bạn có List<T>
a và List<T>
b và bạn muốn kiểm tra xem chúng có bằng các điều kiện sau không:
1) O (n) thời gian chạy dự kiến
2) Bình đẳng được định nghĩa là: Với tất cả các phần tử trong a hoặc b, số lần phần tử xảy ra trong a bằng số lần phần tử xảy ra trong b. Bình đẳng phần tử được định nghĩa là 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;
}
Thời gian chạy là O (n) vì chúng tôi đang thực hiện chèn O (2 * n) vào một hashmap và hashmap O (3 * n) chọn. Tôi chưa kiểm tra đầy đủ mã này, vì vậy hãy cẩn thậ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);