2010-09-22 63 views
3

oldUsers只是allUsers的一个子集,所有旧用户在以下列表中都处于非活动状态。目前的逻辑工作,但我迭代allUsers只是为了获得oldUser的句柄,每次我将活动标志设置为false之前。有没有办法拉相应的记录,让我修改(oldUsers和ALLUSERS是Set<User>型)如何对列表中的元素子集进行修改

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

我想老用户中的对象是所有用户中对象的副本,如果它们是同一对象,则可以直接更新旧用户中的用户。 – jneira 2010-09-22 07:54:03

+0

旧用户不是来自所有用户的副本,而是用不同的代码片段构造并传递给此方法。 – user339108 2010-09-22 08:05:52

回答

5

如果oldUsers包含副本或用户新鲜的情况下,你只是想setActive(false)allUsers这些用户有一个匹配的ID,那么我建议你根据用户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); 
+0

您是不是要去inactivate.retainAll(oldUsers); (即oldUsers而不是oldUser) – user339108 2010-09-22 08:06:43

+0

没错。答案已更新。 – aioobe 2010-09-22 08:11:41

1

如果oldUser和allUsers中的对象是相同的实例,那么你只需更改oldUser。
如果不是,则定义哈希码并等于,并且比:allUsers.retainAll(oldUsers)。因此,您将截取这两个由所有用户实例组成的集合。然而,allUser集合将被改变(它会缩小)。

-2

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

+0

但老用户和所有用户都设置... – aioobe 2010-09-22 07:55:39

+0

因此,也要定义hasCode(),或将它们更改为Maps。 – EJP 2010-09-22 08:39:29