考虑我有一个对象列表,我将它转换为一个Set来做一些像这样的动作:
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)
,但我想查看我的对象的属性。
我的问题是检查广告集是否包含ID = 1
或user = "user1"
或任何属性
谢谢。
答案 0 :(得分:4)
您的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<>();
...
然后你需要保持所有地图同步 - 你需要考虑如果你有多个同名用户等会发生什么。
答案 1 :(得分:1)
我认为最简单和最有效的方法是通过考虑id来覆盖User类中的equals方法。
然后您可以使用List接口中的contains方法
答案 2 :(得分:1)
你是不对的,你不能在Java 7中使用Java流(它们是在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
,显然)。每次使用流都会在幕后进行线性搜索。
那就是说,你可以用流来做奇特的事情。我很高兴学习它们并使用它们,期待那样。