tôi phải xử lý một Map <BitSet,List<List<Integer>> MyMap
Làm thế nào để giữ cho hai vòng lặp trên bản đồ trong java và loại bỏ các phím ở giữa mà không ConcurrentModificationException
if (key1 contains all of corresponding true bits of key2)
Remove from key2 all those values which are common with key1)
Trong quá trình này, nếu số phần tử trong danh sách giảm xuống dưới một THRESHOLD (người dùng xác định số nguyên dương), nó được loại bỏ. Ngoài ra, nếu Bản đồ chứa danh sách trống, thì khóa tương ứng sẽ bị xóa.
Tôi đang sử dụng đoạn mã sau:
List<BitSet> keys = new ArrayList<>(MyMap.keySet());
ListIterator it1=keys.listIterator();
while(it1.hasNext()) {
BitSet key1=(BitSet)it1.next();
ListIterator it2=keys.listIterator(it1.nextIndex());
while(it2.hasNext()) {
BitSet key2=(BitSet)it2.next();
BitSet ankey=(BitSet)key1.clone();
ankey.and(key2);
if(ankey.equals(key1)) {//key1 is subset and key2 is superset
if(removePoints(key1,key2)) {
it1.remove();
break;
}
}
else if(ankey.equals(key2)) {
if(removePoints(key2,key1)) {
it2.remove();
}
}
}
}
public static boolean removePoints(BitSet key1,BitSet key2)
{
List<List<Integer>> list1=MyMap.get(key1);
List<List<Integer>> list2=MyMap.get(key2);
Boolean ret=false;
for(int i=0;i<list1.size();i++) {
List<Integer> sublist1=list1.get(i);
for(int j=0;j<list2.size();j++) {
List<Integer> sublist2=list2.get(j);
sublist1.removeAll(sublist2);
if(sublist1.isEmpty())
break;
}
if(sublist1.size()<=THRESHOLD)
list1.remove(sublist1);
if(list1.isEmpty()) {
MyMap.remove(key1);
ret=true;
}
}
return ret;
}
Nhưng chương trình được đưa ra lỗi:
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification
at java.util.ArrayList$Itr.next
Ngoài ra, không chắc chắn nếu điều này là cách hiệu quả để mã? Vì Bản đồ chứa ~ 2000 mục nhập. Xin cho biết.
Ồ, xin lỗi. Đã đổi tên ll1 thành sublist1 và ll2 thành sublist2. Xin hãy nhìn lại. Tôi không thể nghĩ ra cái tên nào tốt hơn cho nó1 (Iterator 1) và it2 (Iterator 2). Liên kết bạn vừa giới thiệu không chứa hai trình vòng lặp cố gắng sửa đổi bộ sưu tập :-( – Kaur
'S' trong' S.listIterator' là gì? Và 'THRESHOLD' – greenkode
Chỉnh sửa ... Ngưỡng chỉ định tính hợp lệ của danh sách con. – Kaur