• ArrayList中元素去重问题


    如题所示,如果一个ArrayList中包含多个重复元素,该如何去重呢?

    思路一以及实现:

    声明2个ArrayList,分别为listA与listB ,listA为待去重list ,listB 保存去重之后数据 。遍历listA ,然后判断listB中是否包含各个元素,若不包含,把此元素加入到listB中。

    代码实现:

    辅助实体类:Student

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    package com.model.elgin.collections;

    public class Student {
       
       
    private String id;
       
    private String name;
        
       
    public String getId() {
           
    return id;
        }
       
    public void setId(String id) {
           
    this.id = id;
        }
       
    public String getName() {
           
    return name;
        }
       
    public void setName(String name) {
           
    this.name = name;
        }       
        
       
    public Student(String id, String name) {
           
    super();
           
    this.id = id;
           
    this.name = name;
        }
        
        @Override
       
    public String toString() {
           
    return "Student [id=" + id + ", name=" + name + "] " ;
        }

    }

    测试类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    package com.model.elgin.collections;

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;

    public class TestArrayList {
        
    public static void main(String[] args) {
              deleteRepeat1();
        }
         
      
    /*
        * list去重1
        * ArrayList元素的判断包含使用equals方法
        */

       
    public static void deleteRepeat1(){
             List<Student> listA=
    new ArrayList<Student>();
             List<Student> listB=
    new ArrayList<Student>();
             Student st1=
    new Student("1","jack");
             Student st2=
    new Student("2","jim");
             Student st3=
    new Student("3","lucy");
             Student st4=
    new Student("4","lily");
             Student st5=
    new Student("4","lily");
             listA.add(st1);
             listA.add(st2);
             listA.add(st3);
             listA.add(st4);
             listA.add(st5);
            
    for (Student student : listA) {
               
    if(!listB.contains(student)){
                    listB.add(student);
                }
            }
             
            System.out.println(listB);
             
         }
    }

    运行之后,发现打印结果并没有满足我们的要求,即去掉listA中重复的元素,这是怎么回事呢?

    这是因为在使用List的contains() 方法判断是否包含一个元素时,需要把该元素与list中的所有元素进行比较,进而来确定是否包含这个元素。而上面的Student类中,并没有具体的实现equals方法,因而在比较的时候使用了Object的equals方法,故无法正确的比较,进而导致去重失败。

    修改后的Student类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    package com.model.elgin.collections;

    public class Student {
       
       
    private String id;
       
    private String name;
        
       
    public String getId() {
           
    return id;
        }
       
    public void setId(String id) {
           
    this.id = id;
        }
       
    public String getName() {
           
    return name;
        }
       
    public void setName(String name) {
           
    this.name = name;
        }
            
        
       
    public Student(String id, String name) {
           
    super();
           
    this.id = id;
           
    this.name = name;
        }
        
        @Override
       
    public boolean equals(Object obj) {
           
    if(!(obj instanceof Student)){
               
    return false;
            }
            Student student=(Student) obj;
           
    if(this.getId().equals(student.getId()) && this.getName().equals(student.getName())){
               
    return true;
            }
           
    return false;
        }
        
        @Override
       
    public String toString() {
           
    return "Student [id=" + id + ", name=" + name + "] ";
        }   
    }

    再次运行测试类,去重成功。

    思路二以及实现:

    我们知道,集合Set中的元素是唯一的,那么能否利用此特性,来完成list元素的去重呢。显然是可以的。

    这里我们使用HashSet ,HashSet的去重原理:

    首先判断对象的hashcode值是否相同,如果相同,则再调用equals方法比较对象是否相等。如果相等,则说明元素重复,不添加到集合。

    因此,使用Set的特性去重,Student类还必须重写Object 的hashcode方法。

    实现代码:

    Student类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    package com.model.elgin.collections;

    public class Student {
       
       
    private String id;
       
    private String name;
        
       
    public String getId() {
           
    return id;
        }
       
    public void setId(String id) {
           
    this.id = id;
        }
       
    public String getName() {
           
    return name;
        }
       
    public void setName(String name) {
           
    this.name = name;
        }
                
       
    public Student(String id, String name) {
           
    super();
           
    this.id = id;
           
    this.name = name;
        }
        
        @Override
       
    public boolean equals(Object obj) {
           
    if(!(obj instanceof Student)){
               
    return false;
            }
            Student student=(Student) obj;
           
    if(this.getId().equals(student.getId()) && this.getName().equals(student.getName())){
               
    return true;
            }
           
    return false;
        }
        
        @Override
       
    public String toString() {
           
    return "Student [id=" + id + ", name=" + name + "] ";
        }
        
        @Override
       
    public int hashCode() {
           
    return this.id.hashCode() + this.name.hashCode();
        }
        
    }

    测试类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    package com.model.elgin.collections;

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;

    public class TestArrayList {
        
    public static void main(String[] args) {
              deleteRepeat2();
        }
        
       
    /*
         * list去重2
         * HashSet无序/唯一,判断包含使用hashcode、equals方法
         */

        
    public static void deleteRepeat2(){
             List<Student> listA=
    new ArrayList<Student>();
             Set<Student> listSet=
    new HashSet<Student>();
             Student st1=
    new Student("1","jack");
             Student st2=
    new Student("2","jim");
             Student st3=
    new Student("3","lucy");
             Student st4=
    new Student("4","lily");
             Student st5=
    new Student("4","lily");
             listA.add(st1);
             listA.add(st2);
             listA.add(st3);
             listA.add(st4);
             listA.add(st5);
             listSet.addAll(listA);
             System.out.println(listSet);
             
          }
    }
  • 相关阅读:
    里氏替换原则
    开闭原则
    Java Swing 介绍
    redis发布订阅模式
    Spring Cloud Bus消息总线+rabbitmq+Gradle(Greenwich.RELEASE版本)
    文档对象模型(DOM)系列三:处理元素属性
    文档对象模型(DOM)系列二:在DOM元素间移动
    文档对象模型(DOM)系列一:DOM基础
    深入理解javascript中的this 关键字(转载)
    javascript中的函数
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293721.html
Copyright © 2020-2023  润新知