ฉันรู้ว่านี่เป็นเธรดเก่า แต่ไม่มีคำตอบอื่นใดที่แก้ไขกรณีการใช้งานของฉันได้อย่างสมบูรณ์ (ฉันเดาว่า Multiset ของ Guava อาจทำแบบเดียวกัน แต่ไม่มีตัวอย่างที่นี่) โปรดแก้ตัวการจัดรูปแบบของฉัน ฉันยังใหม่ต่อการโพสต์ในการแลกเปลี่ยนสแต็ค นอกจากนี้แจ้งให้เราทราบหากมีข้อผิดพลาดใด ๆ
ให้บอกว่าคุณมีList<T>
a และ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 (n) เพราะเรากำลังทำการแทรก O (2 * n) ลงใน hashmap และเลือก hashmap O (3 * 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);