移除ArrayList中的重复元素

去重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 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;
    }
}




你可能感兴趣的:(Java)