1. 程式人生 > >移除ArrayList中的重複元素

移除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; } }