我有以下逻辑来删除系统中的非活动用户,因为我们在迭代列表时无法删除行.有没有更好的方法来处理这个?
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)
这是一个非常好的方式来做它恕我直言.
我可能采用的其他方式,使用索引并在反向循环时删除.
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)
目前想不到任何其他人.