• Java集合框架浅谈List(三)


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

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

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

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

    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);


     

  • 相关阅读:
    [LeetCode-JAVA] Count Complete Tree Nodes
    [LeetCode-JAVA] Shortest Palindrome
    [LeetCode-JAVA] Best Time to Buy and Sell Stock IV
    [LeetCode-JAVA] Word Ladder II
    [LeetCode-JAVA] Jump Game II
    Keil开发的ARM程序main函数之前的汇编分析
    STM32平台SD卡的FatFS文件系统开发
    STM32 Cortex-M3 NMI异常
    应对STM32 Cortex-M3 Hard Fault异常
    LwIP协议栈开发嵌入式网络的三种方法分析
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3112826.html
Copyright © 2020-2023  润新知