[英]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.