如果对象具有相同的字段,如何过滤和组合对象

我试图解决这个问题但被卡住了。我有类用户:


public class User {


   public String name;

   public String email;

   public Integer age;

   public String group;


   public User() {

   }


   public User(String name, String email, Integer age, String group) {

      this.name = name;

      this.email = email;

      this.age = age;

      this.group = group;

   }

}

用户列表如下所示:


List<User> users = new ArrayList<>();

users.add(new User("Max" , "test@test", 20 , "n1"));

users.add(new User("John" , "list@test", 21 , "n2"));

users.add(new User("Nancy" , "must@test", 22 , "n3"));

users.add(new User("Nancy" , "must@test", 22 , "n4"));

users.add(new User("Max" , "test@test", 20 , "n5"));

但是此列表包含仅在组中有所不同的重复对象。所以我需要将重复对象组合成新对象,如下所示:


用户:姓名:“Max”,电子邮件:“test@test”,年龄:20,组:“n1,n5”


用户:姓名:“John”,电子邮件:“list@test”,年龄:21,组:“n2”


用户:姓名:“Nancy”,电子邮件:“must@test”,年龄:22,组:“n3,n4”


我知道我需要使用 Java 8 中的 Steam,但不明白具体如何操作。


宝慕林4294392
浏览 237回答 3
3回答

哔哔one

你可以利用toMap收集器,因为它有一个合并功能,可以加入你的重复对象,例如我会在每次找到重复对象时创建一个新对象,但你可以只修改现有对象static User join(User a, User b) {&nbsp; &nbsp; return new User(a.getName(), a.getEmail(), a.getAge(), a.getGroup() + "," + b.getGroup());}和流操作。List<User> collect = users.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.collectingAndThen(Collectors.toMap(User::getEmail,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Function.identity(),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (a, b) -> join(a, b)),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; map -> new ArrayList<>(map.values())));

胡子哥哥

你可以简单地做:List<User> sortedUsers = new ArrayList<>();// group by email-idMap<String, List<User>> collectMap =&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;users.stream().collect(Collectors.groupingBy(User::getEmail));collectMap.entrySet().forEach(e -> {&nbsp; &nbsp; String group = e.getValue().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// collect group names&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.map(i -> i.getGroup())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.joining(","));&nbsp; &nbsp; User user = e.getValue().get(0);&nbsp; &nbsp; sortedUsers.add(new User(user.getName(), user.getEmail(), user.getAge(), group));});输出:[&nbsp; &nbsp;User [name=John, email=list@test, age=21, group=n2],&nbsp;&nbsp; &nbsp;User [name=Max, email=test@test, age=20, group=n1,n5],&nbsp;&nbsp; &nbsp;User [name=Nancy, email=must@test, age=22, group=n3,n4]]确保添加 getter 和 setter,同时覆盖toString()User 的。

胡说叔叔

这是您需要的工作示例(我希望 :))。它将前 3 个字段的组合视为唯一键。然后它遍历列表并根据键将用户添加到映射并将组作为值。我使用 Map 是因为它可以加快检索速度。在插入新用户之前,我检查它是否已经在地图中。如果是,那么我附加新组。如果不是,我将其插入当前组。import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class User {&nbsp; &nbsp; public String name;&nbsp; &nbsp; public String email;&nbsp; &nbsp; public Integer age;&nbsp; &nbsp; public String group;&nbsp; &nbsp; public static final void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; List<User> users = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; users.add(new User("Max", "test@test", 20, "n1"));&nbsp; &nbsp; &nbsp; &nbsp; users.add(new User("John", "list@test", 21, "n2"));&nbsp; &nbsp; &nbsp; &nbsp; users.add(new User("Nancy", "must@test", 22, "n3"));&nbsp; &nbsp; &nbsp; &nbsp; users.add(new User("Nancy", "must@test", 22, "n4"));&nbsp; &nbsp; &nbsp; &nbsp; users.add(new User("Max", "test@test", 20, "n5"));&nbsp; &nbsp; &nbsp; &nbsp; List<User> filtered = filter(users);&nbsp; &nbsp; &nbsp; &nbsp; filtered.stream().forEach(System.out::println);&nbsp; &nbsp; }&nbsp; &nbsp; public User() {&nbsp; &nbsp; }&nbsp; &nbsp; public User(String key, String group) {&nbsp; &nbsp; &nbsp; &nbsp; String[] keys = key.split("-");&nbsp; &nbsp; &nbsp; &nbsp; this.name = keys[0];&nbsp; &nbsp; &nbsp; &nbsp; this.email = keys[1];&nbsp; &nbsp; &nbsp; &nbsp; this.age = Integer.parseInt(keys[2]);&nbsp; &nbsp; &nbsp; &nbsp; this.group = group;&nbsp; &nbsp; }&nbsp; &nbsp; public User(String name, String email, Integer age, String group) {&nbsp; &nbsp; &nbsp; &nbsp; this.name = name;&nbsp; &nbsp; &nbsp; &nbsp; this.email = email;&nbsp; &nbsp; &nbsp; &nbsp; this.age = age;&nbsp; &nbsp; &nbsp; &nbsp; this.group = group;&nbsp; &nbsp; }&nbsp; &nbsp; public String toString() {&nbsp; &nbsp; &nbsp; &nbsp; return name + " : " + email + " : " + " : " + age + " : " + group;&nbsp; &nbsp; }&nbsp; &nbsp; public String getUniqueKey() {&nbsp; &nbsp; &nbsp; &nbsp; return name + "-" + email + "-" + age;&nbsp; &nbsp; }&nbsp; &nbsp; public static List<User> filter(List<User> users) {&nbsp; &nbsp; &nbsp; &nbsp; Map<String, String> uniqueGroup = new HashMap<>();&nbsp; &nbsp; &nbsp; &nbsp; for (User user : users) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String found = uniqueGroup.get(user.getUniqueKey());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (null == found) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uniqueGroup.put(user.getUniqueKey(), user.group);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uniqueGroup.put(user.getUniqueKey(), found + ", " + user.group);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; List<User> newUsers = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; for (String key : uniqueGroup.keySet()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newUsers.add(new User(key, uniqueGroup.get(key)));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return newUsers;&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java