首页 > 其他分享 >面试题之List集合如何实现去重?

面试题之List集合如何实现去重?

时间:2023-02-02 20:33:33浏览次数:35  
标签:面试题 Person List personList add 集合 new 123456

关于List集合去重的问题 其实是很简单的 不过简单的问题要尽量考虑全面一些!

要考虑JDK1.8的新特性 实现List集合去重的三种方式:

1、方式一 直接定义一个方法 循环遍历判断是否存在重复 如果不存在才添加到新的集合变量中 这里有个注意点就是如果集合存储的是对象这种类型的,并且判断是否重复使用的是contains方法。那就要 记得重写equals方法,因为contains方法底层调用的是Object的equals方法 默认的是比较地址,而我肯定是要比较值的 因此得重写equals!

代码(Coding):

/**
 * 去重的三种方法 第一种自定义方法去重复 循环判断是否有重复元素 没有重复的话才添加到新的集合中
 */
public class Demo01 {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三", "123456", 20));
        personList.add(new Person("李四", "123456", 21));
        personList.add(new Person("王五", "123456", 22));
        personList.add(new Person("张三", "123456", 20));
        List<Person> newPersonList = new ArrayList<>(personList.size());
        // 传入的不是值 其实是一个地址
        distinct(personList, newPersonList);
        // 打印操作
        newPersonList.forEach(i -> {
            System.out.println(i);
        });
    }

    /**
     * 自定义方法去重复元素 循环判断是否存在重复 没有重复的时候 才添加到新的集合中
     *
     * @param personList
     * @param newPersonList
     */
    private static void distinct(List<Person> personList, List<Person> newPersonList) {
        personList.forEach(i -> {
//            System.out.println(i);
            // 判断集合中是否已经存在该元素了
            if (!newPersonList.contains(i)) {
//                System.out.println("newPersonList不存在元素:" + i);
                // 没有重复才添加到新集合中
                newPersonList.add(i);
            }
        });
    }

2、方式二 使用Set集合 来存储 利用Set的特性 不重复的特性

代码(Coding):

/**
 * 去重的第二种方法:Set集合 利用Set集合的特性 不重复的
 */
public class Demo02 {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三", "123456", 20));
        personList.add(new Person("李四", "123456", 21));
        personList.add(new Person("王五", "123456", 22));
        personList.add(new Person("张三", "123456", 20));
        HashSet<Person> hashSet = new HashSet<>(personList);
//        hashSet.forEach(i -> {
//            System.out.println(i);
//        });
        // 使用HashSet可以解决元素重复问题 但是发现顺序不对 如果要保证顺序 推荐使用LinkedHashSet
        // LinkedHashSet 根据插入的顺序来进行排序 也是不重复 无索引的
        LinkedHashSet<Person> linkedHashSet = new LinkedHashSet<>(personList);
        linkedHashSet.forEach(i -> {
            System.out.println(i);
        });
    }
}

3、方式三 使用JDK1.8提供的Stream流 使用Stream流中的distinct去重复方法 这个方法是最简单的

代码(Coding):

/**
 * 第三张去重的方法 使用JDK1.8提供的Stream流 使用Stream流中的distinct方法来解决
 * 这个方法可以说是最简单的了
 */
public class Demo03 {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三", "123456", 20));
        personList.add(new Person("李四", "123456", 21));
        personList.add(new Person("王五", "123456", 22));
        personList.add(new Person("张三", "123456", 20));
        // 直接用JDK1.8的stream流来处理
        List<Person> collect = personList.stream().distinct().collect(Collectors.toList());
        collect.forEach(i -> {
            System.out.println(i);
        });
    }
}

 

标签:面试题,Person,List,personList,add,集合,new,123456
From: https://www.cnblogs.com/bichen-01/p/17087312.html

相关文章

  • 测试面试题
    1、Beta测试与Alpha测试有什么区别?Betatesting(β测试),测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场。Alphatesting(......
  • #yyds干货盘点# LeetCode面试题:两数相加
    1.简述:给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • java Set和List的区别
    1、重复。Set不允许重复插入。2、插入顺序。Set不能保证插入顺序。3、null元素。4、实现类。list方法常用的实现类:ArrayList、LinkedList和Vector。Set:HashSet、Lin......
  • Redis的设计与实现(5)-整数集合
    整数集合(intset)是集合键的底层实现之一:当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.整数集合(intset)......
  • Java - 一道关于Arrays.asList的题目
    题目有这样一道有趣的题目:finalint[]test=newint[]{1,2,3,4};finalInteger[]test2=newInteger[]{1,2,3,4};finalListlist1=Arrays.asList(test);finalListl......
  • 面试题:let const var 的区别 及数据类型
    1.letconstvar的区别答。1var有变量提升,letconst没有2var没有作用域,但是letconst有作用域3varlet声明时可以没有值,但是const声明时必须含有值4var声明......
  • List<Object> 根据对象中的属性过滤数据
    一.代码块publicstaticvoidmain(String[]args){//1.测试数据创建UserEntityuser1=UserEntity.builder().id(1).name("张三").sex(0).build(......
  • 春哥博客 - ArrayList集合
    staticvoidMain(string[]args){//集合:很多数据的一个集合//集合的好处:长度可以任意改变,类型随便ArrayListlist=n......
  • 前端面试题学习-个人总结笔记 Day 2
    前端面试题学习-个人总结笔记Day2这是看别人总结的基础上再度总结的,总结的链接如下链接1.CSS盒子+选择器+可继承属性+选择器优先级2.CSS3新伪类+居中+......
  • Qt | QListWidgetItem返回错误的背景颜色(始终返回颜色值为0)问题解决
    Qt|QListWidgetItem返回错误的背景颜色(始终返回颜色值为0)问题解决使用场景:程序使用QListWidget显示一个列表,这个列表具有点击选择和再次点击取消选择的功能,点击之后需要更......