如何对列表中的元素子集进行修改

时间:2010-09-22 07:44:10

标签: java

oldUsers只是allUsers的一个子集,所有oldUsers都在以下列表中处于活动状态。逻辑当前有效,但我在每次迭代allUsers只是为了获取oldUser的句柄,然后才将active标志设置为false。有没有办法拉出适当的记录并进行修改(oldUsers和allUsers的类型为Set<User>

for (User oldUser : oldUsers) {
    for (User  user : allUsers) {
        if (user.getId().equals(oldUser.getId())) {
            user.setActive(false);
        }
    }
}

3 个答案:

答案 0 :(得分:5)

如果oldUsers包含副本或新用户实例,并且您只想对setActive(false)中具有匹配ID的用户allUsers,那么我建议您覆盖基于用户ID的用户的.equals(和.hash)方法。然后你可以这样做:

Set<User> toInactivate = new HashSet<User>(allUsers);
toInactivate.retainAll(oldUsers);
for (User u : toInactivate)
    u.setActive(false);

另一种方式(可能更优雅)是将用户存储在用户的Map<Integer, User>映射用户ID中。然后你可以简单地做

for (int id : oldUsers.keySet())
    allUsers.get(id).setActive(false);

答案 1 :(得分:1)

如果oldUser和allUsers中的对象是相同的实例,则只需更改oldUser即可 如果没有,你定义hashcode和equals,而不是:allUsers.retainAll(oldUsers)。因此,您将拦截这两个由allUser实例组成的集合。但是,所有用户设置都将被更改(它会缩小)。

答案 2 :(得分:-1)

定义User.equals(),使其比较getId(),并调用List.indexOf(user)。