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);
}
}
}
答案 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)。