检查Set of Object是否包含具有此属性的Object

时间:2017-02-07 09:37:39

标签: java set

考虑我有一个对象列表,我将它转换为一个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 = 1user = "user1"或任何属性

的对象的最佳方法是什么?

谢谢。

3 个答案:

答案 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>以允许IDHashMap<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,显然)。每次使用流都会在幕后进行线性搜索。

那就是说,你可以用流来做奇特的事情。我很高兴学习它们并使用它们,期待那样。