2017-06-02 162 views
0

我在Android Studio中構建了一個應用程序,其中包含各種樹木和灌木首選項和複選框。你檢查一個表明你想要一棵具有特定特徵的樹的框,並且代碼通過庫存中所有樹木和灌木的數組列表(我創建了一個Plant類,其大小,名稱,水果等屬性)以及將與該條件相匹配的對象的所有字符串名稱添加到另一個不同屏幕上要打印的字符串(稱爲「選擇」)的另一個數組列表(在另一步中打印之前,重複項被刪除)。如何在迭代過程中從arraylist中刪除對象?

問題是在迭代期間從陣列列表中刪除對象。下面是一個示例:

if (cb_s.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "s"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    } 
    if (cb_m.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "m"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    } 
    if (cb_l.isChecked()) { 
     for(Plant p : test){ 
      if(p.getSize() == "l"){ 
       selection.add(p.getName()); 
      } 
      else{ 
       selection.remove(p.getName()); 
       test.remove(p); 
      } 
     } 
    }  

對於每一個複選框選中,它貫穿名爲「測試」,以挑選出對應的複選框(在這種情況下,植物的ArrayList,這3座將挑選出小型,中型,以及大型植物--S,M和L),並將它們添加到另一個字符串數組列表中,以便稍後打印。它還從第一個數組列表中移除植物,測試,以便在其他複選框被選中的情況下不能進行比較(這將導致植物的最終列表不滿足用複選框選擇的所有標準)。

Java不喜歡我試圖從arraylist'test'中移除元素的方式,因爲這是我正在迭代的。如果他們不符合標準,在迭代過程中刪除對象的正確方法是什麼?我聽說我應該使用實際集合的迭代器?我將如何去做這個代碼?

謝謝!

+0

可能的重複[迭代通過集合,避免ConcurrentModificationException在循環中刪除時](https://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re) – ashbygeek

回答

1

如果你想從列表中刪除項目不要用==方法比較String,但在所有情況下.equals做到這一點,例如

p.getSize().equals("s") 

代替

p.getSize() == "s" 
0

在迭代列表時,應該使用iterator表示:

Iterator<Plant> iterator = test.iterator(); 
while (iterator.hasNext()) { 
    p = iterator.next(); 
    if(p.getSize().equals("l")){ 
     selection.add(p.getName()); 
    } else { 
     selection.remove(p.getName()); 
     iterator.remove(); 
    } 
} 

你也應該比較字符串與equals方法。 ==將檢查對象是否是相同的實例,而equals將檢查字符串中的相同內容。

相關問題