簡體   English   中英

檢查對象集是否包含具有此屬性的對象

[英]Check if Set of Object contain an Object with this attribute

考慮到我有一個對象列表,我將其轉換為一個集合,以進行如下操作:

List<User> listUser = new ArrayList<>();
listUser.add(new User(1, "user1"));
listUser.add(new User(2, "user2"));
listUser.add(new User(3, "user3"));

Set<User> myset = new HashSet<>(listUser);

我知道有一個contains(Object o)但我想檢查一下我Object的屬性。

我的問題是檢查集合是否包含ID = 1user = "user1"或任何屬性的對象的最佳方法是什么?

謝謝。

您的User類是否僅使用ID覆蓋equals 如果是這樣,您可以使用:

if (mySet.contains(new User(1, "irrelevant"));

請注意,有一個叫做mySet東西實際上是一個List而不是Set是很奇怪的。我會考慮更改名稱或類型。 如果使用HashSet ,則需要覆蓋hashCodeequals ,但是無論如何都要遵守Object的常規合同。

如果您希望能夠通過多個不同的屬性進行檢查-或不想覆蓋User相等性-那么可以考慮創建地圖,例如

Map<Integer, User> usersById = new HashMap<>();
Map<String, User> usersByName = new HashMap<>();
...

然后,您當然需要使所有地圖保持同步-並且需要考慮如果有多個具有相同名稱的用戶等會發生什么。

我認為最簡單,最簡單的方法是僅考慮ID即可覆蓋User類中的equals方法。

然后,您可以從List界面使用contains方法

正確的說,您不能將Java流與Java 7一起使用(它們是Java 8中引入的)。 對於Java 7,我建議您使用增強的for循環,在該循環中檢查搜索條件( if (u.getId() == 1) )並采取適當的措施。

如果遇到for循環會執行的線性搜索問題,則可以構建映射: HashMap<Integer, User>允許按ID查找,而HashMap<String, User>允許按用戶名查找。 Map.containsKey()將告訴您地圖是否包含特定用戶。 您需要注意地圖包含所有用戶,並且當從您的集合/列表中刪除用戶時,當然還要從地圖中刪除用戶(哎呀,現在只看到Jon Skeet已經說了所有這些,對不起)。

對於使用Java 8並在此處閱讀的任何人,流的使用不必太花哨。 幾個例子:

    boolean containsUser1 = myset.stream().anyMatch(u -> u.getId() == 1);

這是true

    User[] u1Array = myset.stream().filter(u -> u.getId() == 1).toArray(User[]::new);
    Set<User> u1Set = myset.stream().filter(u -> u.getUserName().equals("user1")).collect(Collectors.toSet());

這兩個都產生[1 user1] (顯然,第一個為數組,第二個為s Set )。 每次使用流都會在幕后進行線性搜索。

就是說,您可以使用流來做一些精美的事情。 我發現學習和使用它們很高興,期待着它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM