2014-10-20 62 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