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