如题所示,如果一个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);
         
      }
}

ArrayList中元素去重问题的更多相关文章

  1. Java删除ArrayList中的重复元素

    Java删除ArrayList中的重复元素的2种方法 ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素,重复的元素,并保持元素的插入顺序.在编码时我们经常会遇到那种必 ...

  2. Java之——删除ArrayList中的反复元素的2种方法

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47414935 ArrayList是Java中最经常使用的集合类型之中的一个.它同意 ...

  3. python列表里的字典元素去重

    去重 def list_dict_duplicate_removal(): data_list = [{"a": "123", "b": & ...

  4. Java 删除ArrayList中重复元素,保持顺序

    // 删除ArrayList中重复元素,保持顺序          public static List<Map<String, Object>> removeDuplicat ...

  5. 使用Arraylist将数组中元素随机均等乱序分为N个子数组

    使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...

  6. 如何使用 Java 删除 ArrayList 中的重复元素

    如何使用 Java 删除 ArrayList 中的重复元素 (How to Remove Duplicates from ArrayList in Java) Given an ArrayList w ...

  7. ArrayList中重复元素处理方法.[Java]

    1.使用HashSet删除ArrayList中重复的元素 private static void sortByHashSet() { ArrayList<String> listWithD ...

  8. 【面试题】如何删除 ArrayList 中奇数位置的元素?

    如何删除 ArrayList 中奇数位置的元素? 面试题携程 import java.util.ArrayList; import java.util.Iterator; import java.ut ...

  9. ArrayList中删除null元素效率比较

    package test; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; i ...

随机推荐

  1. BZOJ3306: 树

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 311  Solved: 86[Submit][Status] Description ...

  2. js设置与获取Cookie

    /*设置与获取Cookie*/ var Cookie ={} Cookie.write = function(key, value, duration){ var d = new Date(); d. ...

  3. VS2010 需要缺少的web组件才能加载该项目

    到的问题是解决方案中部分项目无法加载, 提示需要缺少的web组件才能加载该项目,是否通过WEB安装组件来网络安装, 点击确定以后就什么也没有了. 到微软网站去下载Microsoft Web Platf ...

  4. 重装yum

    1)卸载yum rpm -aq|grep yum|xargs rpm -e --nodeps 2)下载并安装python-urlgrabber,python-pycurl,yum-metadata-p ...

  5. CodeIgniter的缓存设置

    数据库缓存 数据库缓存类允许你把数据库查询结果保存在文本文件中以减少数据库访问. 激活缓存需要三步: 在服务器上创建一个可写的目录以便保存缓存文件. 在文件 application/config/da ...

  6. Azure PowerShell 1.0.0以上版本在中国Azure使用的注意事项

    随着Azure PowerShell 1.0.0+的推出,越来越多的客户开始使用新的版本的Azure PowerShell.此版本的PowerShell最大的改变在于将原先的Switch-AzureM ...

  7. 选择符优先级-----:link伪类

    问题:请指出以下结构中,A标签内的字体颜色. <style> a{ color:#ccc}/* 灰色 */ .alink a{color:#F60}/* 橙色 */ h1 a{color: ...

  8. 【转】Bootloader之uBoot简介(转)

    原文网址:http://blog.csdn.net/sadamoo/article/details/8139946 来自http://blog.ednchina.com/hhuwxf/1915416/ ...

  9. Mysql 不同版本 说明

    Mysql 的官网下载地址: http://dev.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Server 社区版本,免费,但 ...

  10. java事务的处理

    java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务. 如果数据库操作在某一步没有执行或出现异常而导致事务失败,这样有的事务被执行有的就没有被执行,从而就有了事务的回滚,取消先 ...