为了账号安全,请及时绑定邮箱和手机立即绑定

如何在java 8中按列表对象的多个参数分组并删除重复的行?

如何在java 8中按列表对象的多个参数分组并删除重复的行?

牛魔王的故事 2022-09-28 10:28:54
这是我的代码:public class User{        private String id;        private String userName;        private Long birthDate;        private String address;        private boolean enabled;        //Constructors        // Getters && Setters        ...}public class ServiceUser{    List<User> users=new ArrayList<>();    public ServiceUser(){        users.add(new User("OPS","MESSI",15454222454L,"ADRESSE 1",true))        users.add(new User("TA1","RICHARD",1245485456787L,"ADRESSE 1",true));        users.add(new User("XA5","LANG",659854575424L,"ADRESSE 2",true));        users.add(new User("DS7","RICHARD",1245485456787L,"ADRESSE 1",false));        users.add(new User("OPD6","LONG",659854575424L,"ADRESSE 2",false));        ...    }    protected List<User> getFiltredUsers(){        // TODO here    }}我想获得如下用户列表:User("OPS","MESSI",15454222454L,"ADRESSE 1",true)如何删除所有重复的行,使用相同的用户名,出生日期,地址?Nb:用户列表由数据库返回,只是为了示例,我这样说。
查看完整描述

2 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

以下代码将删除重复项,并仅返回用户列表中的不同元素:


//used for grouping them by name, birthday and address

static Function<User, List<Object>> groupingComponent = user ->

Arrays.<Object>asList(user.getName(), user.getBirthday(),user.getAddress());

//grouping method used for grouping them by groupingComponent and frequency of it

private static Map<Object, Long> grouping(final List<User> users) {

    return users.stream()

            .collect(Collectors.groupingBy(groupingComponent, Collectors.counting()));

}

//filtering method used for filtering lists if element is contained more than 1 within a list

private static List<Object> filtering(final Map<Object, Long> map) {

    return map.keySet()

            .stream()

            .filter(key -> map.get(key) < 2)

            .collect(Collectors.toList());

}

简单的用法是:filtering(grouping(users));


System.out.println(filtering(grouping(users)));

更新 3:说实话,由于这三个参数(生日,姓名和地址),这有点棘手。我现在能想到的最简单方法是实现hashCode并等于User类中的方法,例如(如果用户具有相同的三个值,则将其标记为相同):


@Override

public int hashCode() {

    return (43 + 777);

}

@Override

public boolean equals(Object obj) {

    // checks to see whether the passed object is null, or if it’s typed as a 

    // different class. If it’s a different class then the objects are not equal.

    if (obj == null || getClass() != obj.getClass()) {

        return false;

    }

    // compares the objects’ fields.

    User user = (User) obj;

    return getName().contains(user.getName())

            && getBirthday() == user.getBirthday()

            && getAddress()== user.getAddress();

}

并按照以下方法删除所有重复项


   public static List<User> filter(List<User> users) {

        Set<User> set = new HashSet<>();

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

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

        Map<Boolean, List<User>> partitions = users.stream().collect(Collectors.partitioningBy(user -> set.add(user) == true));

        uniqueUsers.addAll(partitions.get(true));

        doubleUsers.addAll(partitions.get(false));

        uniqueUsers.removeAll(doubleUsers);

        return uniqueUsers;

    }


查看完整回答
反对 回复 2022-09-28
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

而不是 :List

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

您可以使用 a(我在此示例中使用了 ,):SetHashSet

Set<User> users=new HashSet<>();

Sets不允许重复,这样您甚至不需要过滤。

参见:https://docs.oracle.com/javase/7/docs/api/java/util/Set.html


查看完整回答
反对 回复 2022-09-28
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信