簡體   English   中英

迭代時從列表中刪除對象不起作用(使用迭代器)

[英]Removing object from a list while iterating it doesn't work (with iterator)

這是方法:

public void deleteEvent(View view){
        Intent intent = new Intent(this, MainActivity.class);

        for (User myUser:LocalDataBase.getEventByID(eventID).getInvitedUsersTotal()){
            for (Event myEvent:myUser.getAttendingList())
            {
                ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator();
                if (myEvent.getId()==eventID){
                    itr_attending.remove();
                }

            }
        }

        Toast.makeText(getApplicationContext(), "The event was deleted",Toast.LENGTH_LONG).show();
        startActivity(intent);
}

此方法是為了從數據庫中刪除事件。 為此,我需要將其從每個受邀用戶的“出席列表”中刪除。 (如果用戶說他要去參加活動,那么活動將移到他的這個列表中)。

每個事件都有一個受邀用戶列表(invitedUsersTotal) ,對於每個用戶,該方法應遍歷用戶的出席列表並為所需事件(myEvent.getId()==eventID)搜索,然后刪除該事件。

最后,該事件不會從出席者列表中刪除。

我在這里做錯了什么?

閱讀ListIterator.remove()Javadoc

從列表中刪除由next()previous()返回的最后一個元素

您永遠不會在列表迭代器上調用next()previous() ,因此無需刪除任何內容。


尚不清楚您打算從列表中刪除什么-但是,在同一列表中同時有兩個迭代器的事實表明-如果確實刪除了任何內容,則無論如何都會得到ConcurrentModificationException

我認為您需要用顯式迭代替換內部的增強型for循環:您不能從要增強型for循環迭代的列表中刪除:

for (User myUser: ...){
  Iterator<Event> it = myUser.getAttendingList().iterator();
  while (it.hasNext()) {
    Event myEvent = it.next();
    if (myEvent.getId()==eventID){
      it.remove();
    }
  }
}

像這樣

ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator();
      int id = myEvent.getId()
      while(itr_attending.hasNext()){               
           if (id==eventID){
               itr_attending.remove();
           }
      }

我認為您應該這樣迭代:

 ListIterator<Event> itr_attending =myUser.getAttendingList().listIterator();
  // Below you are iterating
  while(itr_attending.hasNext()){
       Event event = itr_attending.next();
       int eventId = event.getEventId() // Or something like that based on event object
       if (myEvent.getId()==eventID){
           itr_attending.remove();
       }
  }

獲得迭代器后,需要使用itr_attending.hasNext()循環。 它將檢查循環中是否有下一個元素。 如果有,則條件成功,並且可以通過itr_attending.next()獲得Event對象。 然后,執行您想做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM