2014-10-20 45 views
0

我是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) 

能有人告诉我我做错了什么?

非常感谢

+2

您可以在快速枚举地图时修改地图的内容。你不能这样做。 – njzk2 2014-10-20 13:36:57

回答

0

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

+0

非常感谢您的帮助。我试过了代码,但它给了我“TreeMap $ Node不能转换为java.lang.Comparable”的强制关闭。谢谢 – User2014 2014-10-20 22:05:28

+0

你如何创建地图?请粘贴代码 – 2014-10-21 09:15:19

+0

对不起,我一直很忙。这是我的TreeMap问题。有效。再一次,非常感谢你的帮助。 – User2014 2014-10-22 01:10:50