Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果对象具有相同的字段,如何过滤和组合对象_Java_List_Collections_Java 8_Java Stream - Fatal编程技术网

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

Java 如果对象具有相同的字段,如何过滤和组合对象,java,list,collections,java-8,java-stream,Java,List,Collections,Java 8,Java Stream,我已经试着解决这个问题了,但我被卡住了。我有一个类用户: 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) { thi

我已经试着解决这个问题了,但我被卡住了。我有一个类用户:

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

我知道我需要使用Java8中的蒸汽,但不知道具体如何使用


请帮忙,这是一个你需要的工作示例,我希望:

它将前3个字段的组合视为唯一键。然后,它遍历列表,并根据键将用户添加到地图中,并将组作为值。我使用地图是因为它使检索速度更快。在插入新用户之前,我会检查它是否已经在地图中。如果是,则附加新组。如果不是,则将其与当前组一起插入

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class User {

    public String name;
    public String email;
    public Integer age;
    public String group;

    public static final void main(String[] args) {
        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"));

        List<User> filtered = filter(users);
        filtered.stream().forEach(System.out::println);
    }

    public User() {
    }

    public User(String key, String group) {
        String[] keys = key.split("-");
        this.name = keys[0];
        this.email = keys[1];
        this.age = Integer.parseInt(keys[2]);
        this.group = group;
    }

    public User(String name, String email, Integer age, String group) {
        this.name = name;
        this.email = email;
        this.age = age;
        this.group = group;
    }

    public String toString() {
        return name + " : " + email + " : " + " : " + age + " : " + group;
    }

    public String getUniqueKey() {
        return name + "-" + email + "-" + age;
    }

    public static List<User> filter(List<User> users) {
        Map<String, String> uniqueGroup = new HashMap<>();
        for (User user : users) {
            String found = uniqueGroup.get(user.getUniqueKey());
            if (null == found) {
                uniqueGroup.put(user.getUniqueKey(), user.group);
            } else {
                uniqueGroup.put(user.getUniqueKey(), found + ", " + user.group);
            }
        }

        List<User> newUsers = new ArrayList<>();
        for (String key : uniqueGroup.keySet()) {
            newUsers.add(new User(key, uniqueGroup.get(key)));
        }

        return newUsers;
    }

}
您只需执行以下操作:

List<User> sortedUsers = new ArrayList<>();
// group by email-id
Map<String, List<User>> collectMap = 
                 users.stream().collect(Collectors.groupingBy(User::getEmail));

collectMap.entrySet().forEach(e -> {
    String group = e.getValue().stream()                     // collect group names
                               .map(i -> i.getGroup())
                               .collect(Collectors.joining(","));
    User user = e.getValue().get(0);
    sortedUsers.add(new User(user.getName(), user.getEmail(), user.getAge(), group));
});
确保添加getter和setter,同时覆盖User的toString。

您可以利用toMap collector,因为它有一个合并功能,可以连接重复的对象,例如,每次发现重复的对象时,我都会创建一个新对象,但您可以修改现有对象

static User join(User a, User b) {
    return new User(a.getName(), a.getEmail(), a.getAge(), a.getGroup() + "," + b.getGroup());
}
还有小溪

List<User> collect = users.stream()
            .collect(Collectors.collectingAndThen(Collectors.toMap(User::getEmail,
                            Function.identity(), 
                            (a, b) -> join(a, b)),
                    map -> new ArrayList<>(map.values())));

到目前为止你都试了些什么?我真的不认为溪流能帮到你。您的Java水平如何:您是否可以使用伪代码并自己实现它?您是否想要一个完整的解决方案?预期的输出与给定的描述不匹配。为了更好地帮助你,请把这篇文章写下来并改正。另见@Zabuza的coment。图像不如实际代码有用。我建议为您的用户对象添加一个id字段,以便轻松识别唯一的用户。可能重复
List<User> collect = users.stream()
            .collect(Collectors.collectingAndThen(Collectors.toMap(User::getEmail,
                            Function.identity(), 
                            (a, b) -> join(a, b)),
                    map -> new ArrayList<>(map.values())));