我有一个ArrayList
包含一些对象,例如User
,每个对象都有一个name
和password
属性.如何仅删除User
具有特定"名称" 的对象ArrayList
?
NPE*_*NPE 22
Iterator<User> it = list.iterator();
while (it.hasNext()) {
User user = it.next();
if (user.getName().equals("John Doe")) {
it.remove();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个想法:如果User
类可以由用户名唯一定义,并且如果您使用以下内容覆盖equals
:
public boolean equals(Object arg0) {
return this.name.equals(((user) arg0).name);
}
Run Code Online (Sandbox Code Playgroud)
您可以删除User
而不迭代列表.你可以这样做:
list.remove(new User("John Doe"))
Run Code Online (Sandbox Code Playgroud)
你可以使用这样的东西:
// If you are using java 8
userList.removeIf(user-> user.getName().equals("yourUserName"));
// With older version
User userToRemove = null;
for(User usr:userList) {
if(usr.getName().equals("yourUserName")) {
userToRemove = usr;
break;
}
}
userList.remove(userToRemove);
Run Code Online (Sandbox Code Playgroud)
您可能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();
}
}
Run Code Online (Sandbox Code Playgroud)
解决此问题的推荐方法是:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
使用 Iterator 删除对象比通过简单键入删除更有效,ArrayList(Object)
因为它更快,节省 20% 的时间,并且是 Java 集合的标准 Java 实践。
归档时间: |
|
查看次数: |
48657 次 |
最近记录: |