移除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中的元素,看是否有相等的情況存在,同時注意多型
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;
}
}