您的位置:首页 > 其它

移除ArrayList中的重复元素

2016-08-26 16:34 423 查看
去重ArrayList思路

创建一个新的空ArrayList,遍历原list的每一个元素,如果新list中无该元素就添加。

备注1:

如果是自定义对象去重,则需要重写自定义对象的 equals方法,否则,将按Object的equals判断,也就是地址判断。

这样可能就没有意义,比如需求:自定义Person对象,Person里面有姓名和年龄,如果姓名年龄相等,我们判断为相同,用原来的object的equals方法则不行。

备注2:

备注2可不看。

collection的contains方法比较如下:

ArrayList中的contains(Object obj)方法,底层实现判断是equals。

底层实现思路:将obj,拿出来根据obj的equals方法,遍历判断list中的元素,看是否有相等的情况存在,同时注意多态的存在,obj可能是某个对象,已经把equals重写了,因此会执行子类的equals判断方法。

HashSet里面的contains方法,底层首先根据hashCode值判断,如果hashCode不同,则不同,如hashCode相同,则再判断equals

TreeSet比较特殊,因为有排序的存在,contains方法底层判断的是对象实现Comparable接口的compareTo(T o) 方法,但如果构造函数是TreeSet(Comparator c) 时,则应传实现Comparator接口的对象,也就是比较器,这个比较器属于TreeSet,如果不传比较器,会按照内部元素的顺序比较器进行排序,如果传比较器,则按照比较器内的方法。

移除ArrayList中自定义对象的重复元素Demo如下

备注:该例子适用于普通对象(如String)去重,自定义对象去重,以及普通对象与自定义对象混合去重。混合去重可以测试:在例子中的原list中再加入两个相同内容的String对象。能够这么去重的原因看备注2,arrayList的contains方法介绍。

package com.zyf.test.collection;

import java.util.ArrayList;
import java.util.Iterator;

public class DelSameListTest {
public static void main(String[] args) {
Person p1 = new Person("张三",10);
Person p2 = new Person("张三",10);
Person p3 = new Person("李四",10);

ArrayList list = new ArrayList();

list.add(p1);
list.add(p2);
list.add(p3);

ArrayList removelist = removeSimple(list);
for(Iterator it = removelist.listIterator();it.hasNext();){
System.out.println(it.next().toString());
}

}

public static ArrayList removeSimple(ArrayList list){
ArrayList newlist = new ArrayList();
Iterator it = list.listIterator();
while(it.hasNext()){
Object obj = it.next();
if(!newlist.contains(obj))
newlist.add(obj);
}
return newlist;
}
}

class Person{
private String name;
private int age;

Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

@Override
public
9e6e
boolean equals(Object obj) {
if(!(obj instanceof Person))
throw new RuntimeException() ;
Person p = (Person)obj;

if(this.name.equals(p.getName())&& (this.age == p.getAge()))
return true;
return false;
}

@Override
public String toString() {
return "人物:"+this.name+"年龄:"+this.age;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: