2016-07-28 114 views
0

這項工作的方法:從列表Remvoing對象,而迭代它不(與迭代器)

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),然後刪除它。

最後,該事件不會從參與列表中刪除。

我在這裏做錯了什麼?

+0

什麼不行?什麼都沒有發生?你的電腦爆炸了嗎? – Jokab

+0

事件並未從參與列表中刪除,對此表示歉意 – Jack

+0

當您調用'itr_attending .remove()'時,您認爲您從列表中刪除了什麼? –

回答

4

閱讀Javadoc of ListIterator.remove()

從列表中移除由next()previous()

你永遠調用列表迭代next()previous()返回的最後一個元素,所以沒有什麼去除。


這不是很清楚你打算怎樣從列表中刪除 - 但是,你有兩個迭代同時在同一名單上的事實表明 - 如果你真的沒有刪除任何東西 - 你會得到一個ConcurrentModificationException無論如何。

我認爲你需要更換內增強的for循環有一個明確的迭代:

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

這樣做:你不能從你與for循環的增強迭代列表中移除

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

我想你應該重複這樣的:

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對象。然後,做你想做的事。