如题所示,如果一个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. QQ互发消息

    private NewsData data; private void button3_Click(object sender, EventArgs e) //发送 { string x = text ...

  2. 51nod1354 选数字

    01背包tle. 解题报告(by System Message) 类似于背包的DP,以乘积为状态.先把等选数字里面不是K约数的去掉.然后找出K的约数,进行离散化.然后dp[i][j]表示前i个数字乘积 ...

  3. Asp.Net使用代理IP远程获取数据

    /// <summary> /// 远程获取数据 /// </summary> /// <param name="url">url</pa ...

  4. iOS NSNotificationCenter(消息机制)

    转自:http://blog.csdn.net/liliangchw/article/details/8276803 对象之间进行通信最基本的方式就是消息传递,在Cocoa中提供Notificatio ...

  5. jquery中html()/text()/val()区别

    html就是你可以添加<span></span><li></li>的标记text只能写文本如果写了上面的标记则会以文本形式输出,就是输出标签体的内容va ...

  6. 【Python】控制流语句、函数、模块、数据结构

    1.三种控制流语句:if\for\while 2.每句后都要加冒号 3.有elif语句=else后加一个if 注意使用变量名! 注意缩进! 注意控制流语句后面要加冒号! 4.for i in rang ...

  7. 【Python】logging模块学习笔记

    因为做接口自动化测试遇到的一个代码逻辑上的问题,又不知道具体问题出在哪里,所以在模块化代码之前,先学习下python的日志模块logging. 入门1 入门2 日志级别大小关系为:CRITICAL & ...

  8. 【解题报告】[动态规划] RQNOJ - PID15 / 采药

    原题地址:http://www.rqnoj.cn/problem/15 好久以前做的题了,是个背包问题,就不解释了. #include<stdio.h> #define MAX 100 i ...

  9. 【转】Eclipse编辑shell的插件(shellEd)

    原文网址:http://blog.sina.com.cn/s/blog_a42d507e01019mlp.html Eclipse官方网站:http://download.eclipse.org/ 1 ...

  10. Android 自定义view中的属性,命名空间,以及tools标签

    昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的 ...