如题所示,如果一个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. Indoor Positioning System & Real time location system

    背景 惨痛的背景,正如我前面提到的,参加了公司的一个训练营.刚进来公司的新人,内心充满着对未来的美好憧憬,期待自己能闯出属于自己的天地.更何况,作为一名程序员,无比的希望所有人对自己写得代码或者App ...

  2. 转:Entity Framework对NULL值的处理

    今天拿Entity Framework改写早期的一个项目,涉及到对NULL值处理的时候,遇到了点问题,就是如何查询数据库中某字段为NULL的记录,写了几个测试用的例子,然后用SQL Server Pr ...

  3. errno 与 perror()/strerror()函数

    errno是个全局的int型变量,当调用一个系统函数时不管成功不成功都有可能改变errno的值.但只有不成功时errno的值才是有意义的.如果要真的想用errno进行多次打印,刚可以先将其缓存一下.下 ...

  4. Android 高仿豌豆荚 一键安装app 功能 实现

    以往我们那些应用市场 帮我们安装app的时候  我们都得点确定,当然你如果 root 以后 不用点确定 也能自动安装了,后来豌豆荚 推出了一个功能 非root的手机也能不点确定 直接帮你安装好.(如果 ...

  5. RequireJS入门(二) 转

    上一篇是把整个jQuery库作为一个模块.这篇来写一个自己的模块:选择器. 为演示方便这里仅实现常用的三种选择器id,className,attribute.RequireJS使用define来定义模 ...

  6. Bootstrap学习之路(3)---列表组件

    列表是几乎所有网站都会用到的一个组件,正好bootstrap也给我们提供了这个组件的样式,下面我给大家简单介绍一下bootstrap中的列表组件的用法! 首先,重提一下引用bootstrap的核心文件 ...

  7. Android随笔--使用ViewPager实现简单地图片的左右滑动切换

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布 ...

  8. 被投资人“送”入看守所 z

    http://news.cnblogs.com/n/506969/ 拜读了[[畅言]读<被投资人“送”入看守所>一文有感]一文有感,很想跟作者探讨几句.虽然他的看法很有理性,但站在一个刑案 ...

  9. stitch image app (Qt)

    result how to use? source code http://7qnct6.com1.z0.glb.clouddn.com/dropSelect.rar

  10. 代码以兼容高亮方式发布.xml

    函数名: abort  功  能: 异常终止一个进程  用  法: void abort(void);  程序例:  #include <stdio.h>  #include <st ...