2010-09-22 56 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

相關問題