大多数时我们要将自定义的对象存入到集合中,在操作自定义对象时常会遇到的问题。

1. 首先是使用普通for循环遍历对象时,将满足条件的对象删除等操作。

if(26 == list.get(i).getAge())
    list.remove(i);

删除后发现结果用仍有年龄为26的对象被保留下来,这是为什么呢?参见下图。是因为在遍历时有的对象没有被判断到。

Java集合框架浅谈-List(三)_for循环

package com.test.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class AddCustomElements
{
	public static void main(String[] args)
	{
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("zhangsan", 26));
		list.add(new Student("lisi", 26));
		list.add(new Student("wangwu",30));
		list.add(new Student("niuqi", 26));
		//如果要将年龄为26的元素删除使用普通for循环和Iterator迭代器有点区别:
		for(int i = 0; i < list.size(); i++)
		{
			if(26 == list.get(i).getAge())
				//list.remove(i);
				//为了避免有漏掉的对象
				list.remove(i--);			
		}
		System.out.println("For: "+list);		
		//使用迭代器就可以将所有满足条件的对象删除
		for(Iterator<Student> it = list.iterator(); it.hasNext();)
		{
			if(26 == it.next().getAge())
				it.remove();
		}
		System.out.println("Iterator: "+list);		
	}
}
class Student
{
	private String name;
	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;
	}
	private int age;
	public Student()
	{
		
	}
	public Student(String name, int age)
	{
		this.name = name;
		this.age = age;
	}
	public String toString()
	{
		return name.toString()+", "+ age;
	}	
}

2. 如果是同年龄,同名字的Student就看成是同一个对象,要在集合中删除相同元素时,就要复写Student类中的equals()方法。

package com.test.list;
import java.util.ArrayList;
import java.util.List;
public class CustomElements
{
	public static void main(String[] args)
	{
		List<Student> list = new ArrayList<Student>();
		list.add(new Student("zhangsan", 24));
		list.add(new Student("lisi", 29));
		list.add(new Student("zhangsan", 24));
		list.add(new Student("zhaoliu", 30));
		List<Student> tempList = singleElements(list);
		for(Student stu: tempList)
		{
			System.out.println(stu.getName()+", "+stu.getAge());
		}
	}
	//定义一个方法,将List集合中的重复元素去掉
	public static <T> List<T> singleElements(List<T> list) 
	{		 
        List<T> tlist = new ArrayList<T>();
        if (list == null || list.isEmpty()) 
        	{
                 return tlist;
        	}
        for (T t : list) 
        {
                 if (!tlist.contains(t)) 
                 {
                         tlist.add(t);
                 }
        }
        return tlist;
	}
}
class Student
{
	private String name;
	private int age;
	public Student()
	{
		
	}
	public Student(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;
	}
	//如果不复写equals()方法,就不知道什么样的元素是相同的
	public boolean equals(Object obj)
	{		 
	       if (this == obj)	 
	           return true;	 
	       if (obj == null)	 
	           return false;	 
	       if (getClass() != obj.getClass())	 
	           return false;	 
	       Student other = (Student) obj;	 
	       if (age != other.age)	 
	           return false;	 
	       if (name == null) 
	       {	 
	           if (other.name != null)	 
	              return false;	 
	       } 
	       else if (!name.equals(other.name))	 
	           return false;	 
	       return true;	 
	    }
}

 因为复写了equals()方法,可以使用indexOf(), lastIndexOf()方法等

		int index = list.lastIndexOf(new Student("zhangsan", 24));
		System.out.println("index = "+ index);