N个对象集合,如何找出每个集合都存在的对象

如下demo所示,有3个对象集合,想要找出3个集合均拥有的对象数据。根据例子,应当返回id=1、id=2的数据。

public static void main(String[] args) {
        List<User> l1 = new ArrayList<>();
        User u1 = new User();
        u1.setId("1");
        User u2 = new User();
        u2.setId("2");
        l1.add(u1);
        l1.add(u2);

        List<User> l2 = new ArrayList<>();
        User u3 = new User();
        u3.setId("1");
        User u4 = new User();
        u4.setId("2");
        l2.add(u3);
        l2.add(u4);

        List<User> l3 = new ArrayList<>();
        User u5 = new User();
        u5.setId("1");
        User u6 = new User();
        u6.setId("2");
        User u7 = new User();
        u7.setId("3");
        l3.add(u5);
        l3.add(u6);
        l3.add(u7);
    }

    static class User {
        private String id;

        private String phone;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }
    }
阅读 3.3k
5 个回答

第一步,先如@脱氧 所说重写2方法。
第二步,

//java的list自带交集的方法
l1.retainAll(l2);
l1.retainAll(l3);
System.out.println(l1);

首先给User重写hashCodeequals

 @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            User user = (User) o;
            return Objects.equals(id, user.id) && Objects.equals(phone, user.phone);
        }

        @Override
        public int hashCode() {
            return Objects.hash(id, phone);
        }

然后就
List<User> result= l1.stream().filter(item -> l2.contains(item)&&l3.contains(item)).collect(toList());

新手上路,请多包涵

利用HashMap, key是userId, value是次数,对这个n(本例n=3)个集合逐一循环,

List<List<User>> listContainer = Arrays.asList(l1, l2, l3);
Map<String, Integer>  map = new HashMap<>();
for (List<User> list : listContainer) { 
    for(User user : list) {
        if (map.get(user.getId()) != null) {
            map.set(map.get(user.getId()) + 1);
        } else {
            map.set(1);
        }
    }
}
List<String> result = new ArrayList<>();
map.foreach((k, v) -> {
    if (3 <= v) {
        // 满足条件的k
        result.add(k);
    }
})
return result;
l1.stream().filter(user1 -> {
            return l2.stream().anyMatch(user2 -> user2.getId().equals(user1.getId()));
        }).filter(user1 -> {
            return l3.stream().anyMatch(user3 -> user3.getId().equals(user1.getId()));
        }).forEach(System.out::println);

1.首先,建议使用set数据结构,更符合场景。
2.能使用包,我一般都不选择自己写。

CollectionUtils.intersection(CollectionUtils.intersection(l1,l2),l3).forEach(u-> System.out.println(u.id));

    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    static class User {

        @EqualsAndHashCode.Include
        private String id;

        private String phone;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }
    }

使用guava 也可以,就是有点不优雅,common-collection4 挺适合的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题