2012-05-08 86 views
5

我有一個ArrayList包含一些對象,如User,並且每個對象都有一個namepassword屬性。如何才能刪除User對象,該對象具有來自此ArrayList的特定「名稱」?如何從Java中的ArrayList中刪除對象?

+3

你能更準確地描述你的問題嗎?寫一段你正在編寫的代碼片段...... – aleroot

回答

1

只需從ArrayList中搜索您從用戶處獲得的對象,然後測試與您想要刪除的名稱相同的名稱。然後從列表中刪除該對象。

+0

人們希望可以進行優化,否則OP將會停留在O(n)實現中。 –

+1

@ X-Zero在哪種情況下,你不知道對象在列表中的哪個位置可以比'O(n)'更好? –

+2

@ X-Zero:如果所有的OP都是一個數組列表,那麼'O(n)'是他所能希望的最好的(單獨去除元素是'O(n)')。 – NPE

2

,你可以:

  • 環比列表與迭代器
  • 檢查,如果在你的列表中的每個產品(檢查名稱)
  • ,如果它是正確的用戶,請使用remove方法的迭代器。
21
Iterator<User> it = list.iterator(); 
while (it.hasNext()) { 
    User user = it.next(); 
    if (user.getName().equals("John Doe")) { 
    it.remove(); 
    } 
} 
+9

看起來OP沒有爲這個問題做任何工作,你不應該給他們免費的代碼。 –

+0

什麼是列表代表????? –

+1

是的我知道了......謝謝 –

0

您的代碼可能是這樣的:

List<User> users = new ArrayList<User>(); 

public void removeUser(String name){ 
    for(User user:users){ 
     if(user.name.equals(name)){ 
      users.remove(user); 
     } 
    } 
} 
+2

您應該使用迭代器在循環內移除,否則您可能會收到ConcurrentModificationException。 – assylias

+0

@assylias基本的for循環在Java 5中進行了擴展,使得對數組和其他集合的迭代更加方便。嘗試運行此代碼(對於格式化):'List list = new ArrayList ();對於每個循環隱含使用迭代器 –

+1

嘗試運行此代碼 list.add(「a」); for(String s:list){ list.remove(s); }'你應該得到一個異常。 – assylias

4

另一種思考:如果User類可以通過用戶名來唯一確定,如果你忽略的東西,如等於:

public boolean equals(Object arg0){

return this.name.equals(((user) arg0).name); 
} 

您可以在不遍歷列表的情況下刪除用戶。你可以這樣做:

list.remove(新用戶(「張三」))

5

你可能面臨着ConcurrentModificationException,同時試圖從List刪除對象。對此例外的解釋是ArrayList的迭代器是一個快速失敗的迭代器。例如,當它檢測到運行時的集合已被修改時,它將引發異常(失敗)。解決此問題的方法是使用Iterator

下面是一個簡單的例子,演示瞭如何能夠通過List迭代並刪除當滿足特定條件的元素:

List<User> list = new ... 

for (Iterator<User> it = list.iterator(); it.hasNext();) { 

    User user = it.next(); 
    if (user.getUserEmail().equals(currentUser.getUserEmail())) { 
     it.remove(); 
    } 
} 
4

你可以使用這樣的事情:

  arrayList.removeIf(s-> s.getName().contains("yourName")); 
+0

什麼是's'?請讓你的答案更具體些。 –

+0

s在此處是謂詞,並且僅在支持Lambda表達式的JDK 1.8中有效。刪除此集合中滿足給定謂詞的所有元素。 – jprism

2

推薦的方式來解決這個問題:

ArrayList<User> list = new ArrayList<User>(); 
list.add(new User("user1","password1")); 
list.add(new User("user2","password2")); 
list.add(new User("user3","password3")); 
list.add(new User("user4","password4")); 
Iterator<String> iter = list.iterator(); 
while (iter.hasNext()) 
{ 
    User user = iter.next(); 
    if(user.name.equals("user1")) 
    { 
     //Use iterator to remove this User object. 
     iter.remove(); 
    } 
} 

使用迭代器刪除對象比通過簡單地鍵入ArrayList(Object) 進行刪除效率更高,因爲它比Java集合更快,節省20%的時間和標準Java練習。

-1
ArrayList<User> userList=new ArrayList<>(); 
//load data 

public void removeUser(String userName){ 
    for (User user: userList){ 
     if(user.getName()equals(userName)){ 
      userList.remove(user); 
     } 
    } 
} 
+2

迭代遍歷時無法刪除http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re – Gangaraju

相關問題