1. 程式人生 > >ArrayList練習2一去除重複自定義物件

ArrayList練習2一去除重複自定義物件

將自定義元素存到ArrayList集合,去除重複元素。
比如: 存入物件,同姓名,同年齡,同一人為重複元素。

思路:
1.對人描述將資料封入物件。
2.定義容器,將人存入。

3.取出。

import java.util.*;
class ArrayListText
{
	public static void main(String []args)
	{
		ArrayList al=new ArrayList();
		al.add(new person("lishi",5));
		al.add(new person("lishi01",6));
		al.add(new person("lishi02",7));
		al=singleElements(al);
		/*不能去除相同元素*/
		Iterator it=al.iterator();

		while(it.hasNext())
		{
			// sop(it.next().getName)
			/*這樣編譯失敗,因為it.next返回值是Object,而且add(Object obj),需要進行強制型別轉換。*/
			person p=(person)it.next();
			sop(p.getName()+"......"+p.getAge());
		}

	}
	public static ArrayList singleElements(ArrayList al)
	{
		ArrayList newAl=new ArrayList();
		Iterator it=al.iterator();
		while(it.hasNext())
		{
			Object obj=it.next();

			if(!newAl.contains(obj))
			{
			   newAl.add(obj);
			}
		}
		return newAl;
	}
}
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 int getAge()
	{
	    return age;
	}
}
不能去除相同元素,因為contains底層呼叫了indexOf(object obj)方法,返回指定物件的索引。



而此方法底層呼叫了指定物件(obj)的 equals方法。
比較陣列中的元素  (ArrayList底層資料結構是陣列)  是否與此物件地址相同,相同為同一元素,返回元素索引。沒有相同元素返回-1。


然後contains用index返回的數值比較,大於等於0,是true,說明包含指定元素。小於0,是false,說明不包含指定元素。
而現在比較的是年齡和姓名,所以需要複寫指定物件也就是person的equals方法。

public boolean equals(Object obj)
{
    person p=(person)obj;
    return this.name.equals(p.getName()) && this.age==p.getAge();
}

list集合中判斷元素是否相同,用的是元素的equals方法,如 :remove contains方法