list实体类多个属性怎么查重

list实体类preple类 有四个属性 id name age sex 现在list存了五个对象
五个实体类分别为 1 张三 18 男
2 张三 18 男
3 李四 20 男
4 李四 18 男

现在需要根据name和sex 查出重复的存在一个list中

我看上面已经有一些案例,可以解决对应问题。我换一种实现方式:
我是通过重写对象的hashCode和equals方法,并通过set集合不存放重复集合的原理实现的。
copy代码执行下,哪里不明白可以私聊讨论下。


import java.util.*;

/**
 * ListDistinctCase
 */
public class ListDistinctCase {
    /**
     * 模拟查出来的person集合
     */
    static List<Person> personList = new ArrayList<Person>(6) {{
        add(new Person("1", "张三", 18, "男"));
        add(new Person("2", "张三", 18, "男"));
        add(new Person("3", "李四", 20, "男"));
        add(new Person("4", "李四", 18, "男"));
    }};

    public static void main(String[] args) {
        // 利用set集合插入对象不重复的原理,所以使用set集合
        Set<Person> personSet = new HashSet<>();
        // 重复人员存储集合
        List<Person> repeatResultList = new ArrayList<>(6);

        personList.forEach(person -> {
            if (!personSet.add(person)) {
                // 如果set中添加对象失败,说明name和sex属性重复,将重复对象添加至repeatResultList中
                // 因为你重写person的Equals和HashCode方法,所以会根据重写的这2个方法判定对象是否重复
                repeatResultList.add(person);
            }
        });

        repeatResultList.forEach(person -> {
            System.out.println("重复人员: " + person);
        });
    }

    private static class Person {
        private final String id;
        private final String name;
        private final Integer age;
        private final String sex;

        public Person(String id, String name, Integer age, String sex) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        /**
         * 重写Equals,HashCode方法,方法中仅保留name个sex属性
         *
         * @param o this
         * @return 相等:true,不相等:false
         */
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            Person person = (Person) o;
            return Objects.equals(name, person.name) && Objects.equals(sex, person.sex);
        }

        @Override
        public int hashCode() {
            return Objects.hash(name, sex);
        }

        @Override
        public String toString() {
            return "Person{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    ", age=" + age +
                    ", sex='" + sex + '\'' +
                    '}';
        }
    }
}

如果是jdk8及以上,可以使用stream流处理方式进行分组处理:groupingBy
可参考博客:https://blog.csdn.net/qq_35893033/article/details/128485642

首先创建一个 HashSet 对象 set 和一个 ArrayList 对象 duplicates 用于存储重复的元素。

然后遍历列表中的每个元素,如果该元素第一次出现,则将其添加到 set 中,否则将其添加到 duplicates 列表中。

最后,输出重复元素的信息。


List<Preple> list = new ArrayList<>();

// 添加五个实体类对象到list中

Set<Preple> set = new HashSet<>();
List<Preple> duplicates = new ArrayList<>();

for (Preple preple : list) {
    if (!set.add(preple)) {
        duplicates.add(preple);
    }
}

System.out.println("重复的数据:");
for (Preple preple : duplicates) {
    System.out.println(preple.getName() + ", " + preple.getSex());
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^