如题所示,如果一个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. 【分享】哪个OS X版本支持哪个Xcode的版本?

    在安装Xcode时,会碰到跟OS X操作系统匹配的问题,对照下下面几个表,以免给自己带来编译不过或者奇怪的错误等问题 以下列表来自网络: Xcode 1.0 - Xcode 2.x (before i ...

  2. UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)

    题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...

  3. [转载] 问题解决:FFmpeg视频编解码库,无法解析的外部信号

    在编译FFmpeg相关项目时,可能会出现: error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_fill(struct AVPicture *,u ...

  4. AIX 第6章 指令记录

    AIX 存储管理 物理卷的概念和管理 卷组的概念和管理 逻辑卷的基本概念和管理 文件系统在逻辑卷上构建 日志文件系统的管理 镜像提高数据可用性 应用系统所需的存储切换 换页空间的功能和管理     在 ...

  5. php文件读写锁

    $file = fopen("test.txt", $fileOpenMode); flock($file, $lockMode) or die("Can't lock& ...

  6. 在Ubuntu里部署Javaweb环境脑残版

    最近在瞎折腾Unbunt,喜欢这里的干净和静谧.能留在这里,那么就得在这里工作,于是部署javaweb就成了头件大事了. 咨询了大牛,都说不会命令你玩毛玩linux,但是万万没有想到,原来ubuntu ...

  7. hdu 1969(二分)

    题意:给了你n个蛋糕,然后分给m+1个人,问每个人所能得到的最大体积的蛋糕,每个人的蛋糕必须是属于同一块蛋糕的! 分析:浮点型二分,二分最后的结果即可,这里要注意圆周率的精度问题! #include& ...

  8. Axis,axis2,Xfire以及cxf对比

    http://ws.apache.org/axis/ http://axis.apache.org/axis2/java/core/ http://xfire.codehaus.org/ http:/ ...

  9. 已经被cocos2dx给折腾的想要放弃它,专注Unity3D的怀抱了!

    一直使用cocos2dx编写自己的2D小游戏,不得不说,编写个人的超级小规模的游戏,使用cocos2dx有一定的优势,首先门槛很低,编写2D游戏用起来也算顺手,可惜一直没有一个优秀的UI编辑器,好不容 ...

  10. LoadRunner--内存指标介绍

    Threads——线程数当前全部线程数============================================ Available MBytes——物理内存的可用数指计算机上可用于运行 ...