TreeMap Force关闭
问题描述:
我是TreeMap的新用户。TreeMap Force关闭
我曾尝试下面的代码:
for(Map.Entry<Integer,Integer> entry : MultiSelect_TreeMap.entrySet()) {
int Books = entry.getValue();
for(Map.Entry<Integer,Integer> entry2 : MultiSelect_TreeMap2.entrySet()) {
int CalculatedBooks = entry2.getKey();
int Books2 = entry2.getValue();
int Pages = CalculatedBooks - (BooksPos * MaxPos);
MySQLITE_DATABASE.DeleteIfExist(Books, Pages);
if(Books == Books2)
{
MultiSelect_LinkedList.add(Pages);
MultiSelect_TreeMap.remove(CalculatedBooks);
MultiSelect_TreeMap2.remove(CalculatedBooks);
}
}
}
但我正在部队密切错误:
的logcat:
10-20 08:15:54.220: E/AndroidRuntime(764): FATAL EXCEPTION: main
10-20 08:15:54.220: E/AndroidRuntime(764): java.util.ConcurrentModificationException
10-20 08:15:54.220: E/AndroidRuntime(764): at java.util.TreeMap$MapIterator.stepForward(TreeMap.java:883)
10-20 08:15:54.220: E/AndroidRuntime(764): at java.util.TreeMap$EntrySet$1.next(TreeMap.java:924)
10-20 08:15:54.220: E/AndroidRuntime(764): at java.util.TreeMap$EntrySet$1.next(TreeMap.java:922)
10-20 08:15:54.220: E/AndroidRuntime(764): at test.project.MainActivity.DeleteAllSelectedNames(MainActivity.java:1012)
10-20 08:15:54.220: E/AndroidRuntime(764): at test.project.MainActivity$15.onClick(MainActivity.java:1274)
10-20 08:15:54.220: E/AndroidRuntime(764): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
10-20 08:15:54.220: E/AndroidRuntime(764): at android.os.Handler.dispatchMessage(Handler.java:99)
10-20 08:15:54.220: E/AndroidRuntime(764): at android.os.Looper.loop(Looper.java:137)
10-20 08:15:54.220: E/AndroidRuntime(764): at android.app.ActivityThread.main(ActivityThread.java:5103)
10-20 08:15:54.220: E/AndroidRuntime(764): at java.lang.reflect.Method.invokeNative(Native Method)
10-20 08:15:54.220: E/AndroidRuntime(764): at java.lang.reflect.Method.invoke(Method.java:525)
10-20 08:15:54.220: E/AndroidRuntime(764): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-20 08:15:54.220: E/AndroidRuntime(764): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-20 08:15:54.220: E/AndroidRuntime(764): at dalvik.system.NativeStart.main(Native Method)
能有人告诉我我做错了什么?
非常感谢
答
A for each loop can not remove items from the underlying collection。您可以指望的indeces手动
for(int i = 0; i < MultiSelect_TreeMap.size(); i++){
//...
}
或使用迭代器
Iterator<Entry<Integer, Integer>> it = MultiSelect_TreeMap.entrySet().iterator();
while(it.hasNext()){
//...
if (condition) {
it.remove();
}
}
编辑: 我猜,你的用例实际上可能是什么。如果在mapA中有一个条目,则等于mapB中的条目,以下代码将从两个映射中删除条目。
Iterator<Entry<Integer,Integer>> it = mapA.entrySet().iterator();
while(it.hasNext()){
Entry<Integer,Integer> entry = it.next();
Integer calcBooks = entry.getKey();
Integer books1 = entry.getValue();
if(mapB.containsKey(calcBooks)){
Integer books2 = mapB.get(calcBooks);
if(books1.equals(books2)){
mapB.remove(entry);
it.remove();
}
}
}
EDIT2:类铸件误差不直接相关的第一个问题。树形图通过比较来组织元素的顺序。因此,树的元素需要一个Comparator。
您可以在快速枚举地图时修改地图的内容。你不能这样做。 – njzk2 2014-10-20 13:36:57