从List中删除对象的最佳方法是什么

use*_*108 9 java

我有以下逻辑来删除系统中的非活动用户,因为我们在迭代列表时无法删除行.有没有更好的方法来处理这个?

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

for (User user : users) {
  if (!user.isActive()) {
      removeUsers.add(user);
  }
}

users.removeAll(removeUsers);
Run Code Online (Sandbox Code Playgroud)

小智 13

如果你使用ArrayList,最好的方法是Jeff M的变体.您也可以使用您的变体,但您应该考虑使用Set(HashSet或IdentityHashSet)而不是ArrayList for removeUser.对于大量数据,它将具有更好的性能.

但对于LinkedList最好的方法是使用Iterator.remove方法:

for (Iterator<User> it = users.iterator(); it.hasNext();)
    if (it.next().isActive())
        it.remove();
Run Code Online (Sandbox Code Playgroud)


Jef*_*ado 8

这是一个非常好的方式来做它恕我直言.

我可能采用的其他方式,使用索引并在反向循环时删除.

for (int i = users.size()-1; i >= 0; i--)
{
    if (!users.get(i).isActive())
    {
        users.remove(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者创建要保留的项目的新列表,并将其替换为旧列表.

List<User> newUsers = new ArrayList<User>();
for (User user : users)
{
    if (user.isActive())
    {
        newUsers.add(user);
    }
}
users = newUsers;
Run Code Online (Sandbox Code Playgroud)

目前想不到任何其他人.

  • -1太杂乱了.用索引反向迭代? (2认同)