![](/img/trans.png)
[英]How to check Object ArrayList contain single attribute of Object without Loop
[英]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 = 1
或user = "user1"
或任何屬性的對象的最佳方法是什么?
謝謝。
您的User
類是否僅使用ID覆蓋equals
? 如果是這樣,您可以使用:
if (mySet.contains(new User(1, "irrelevant"));
請注意,有一個叫做mySet
東西實際上是一個List
而不是Set
是很奇怪的。我會考慮更改名稱或類型。 如果使用HashSet
,則需要覆蓋hashCode
和equals
,但是無論如何都要遵守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.