TreeSet存储自定义对象

时间:2022-09-03 00:01:20
Set:无序,不可重复元素

     |——HashSet:数据结构哈希表,线程非同步,


     |——TreeSet:可以对Set集合中元素进行排序,默认排序是字母自然顺序

需求:
往TressSet集合中存储自定义对象

按照学生年龄排序

import java.util.*;
/*

*/   
class TreeSetDemo
{
	public static void main(String [] args)
	{
		TreeSet tb=new TreeSet();

		tb.add(new Student("lisi02",22));
		tb.add(new Student("lisi007",20));
		tb.add(new Student("lisi09",19));
		tb.add(new Student("lisi01",40));
/*
		运行抛出ClassCastException:Student cannot be cast to java.lang.Comparable异常,当第一个元素存储时,因为集合为空不需要比较排序
		而第二个元素存储时,需要和集合中元素比较排序,内部有一个检查元素是否具备比较性的
		方法,就是强制类型转换,不具备比较性抛异常。

		元素排序:就是利用元素本身的CompareTo方法和集合中的现有元素比较大小,然后排序
		显然Student对象不具备此方法,所以需要实现Comparable接口,并实现compareTo方法。
		字符串之所以可以排序,是因为它已经实现了Comparable
                也就是说对象必须实现comparable才能比较排序
*/
		Iterator it=tb.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}
class Student
{
	private String name;
	private int age;
	Student(String name ,int age)
	{
		this.name=name;
		this.age=age;
	}

	public String getName()
	{
		return name;
	}
	public int getAge()
	{
         return age;
	}
}
所以需要使对象具备比较性 实现Comparable接口

class Student implements Comparable
{
	private String name;
	private int age;
	Student(String name ,int age)
	{
		this.name=name;
		this.age=age;
	}
	public int compareTo(Object obj)						
	{
		if(!(obj instanceof Student))/*其返回true情况如下1.obj是student类的对象2.obj是student类子类的对象 */ 
			throw new RuntimeException("不属于stduent类");

		Student s=(Student)obj;
		if(this.age > s.age)
			return 1;
		if(this.age ==s.age)//当主要条件相等时判断次要条件
		{
			return this.name.compareTo(s.getName());
		}

		return -1;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
         return age;
	}
}

完成代码如下

import java.util.*; /* */ class TreeSetDemo
{
	public static void main(String [] args)
	{
		TreeSet ts=new TreeSet();

		ts.add(new Student("lisi02",22));
		ts.add(new Student("lisi007",20));
		ts.add(new Student("lisi01",40));
		ts.add(new Student("lisi09",40));
	
		Iterator it=ts.iterator();

		while(it.hasNext())
		{ 
            Student s=(Student)it.next();
			System.out.println(s.getName()+"...."+s.getAge());
		}
	}
}

class Student implements Comparable
{
	private String name;
	private int age;
	Student(String name ,int age)
	{
		this.name=name;
		this.age=age;
	}
	public int compareTo(Object obj)						
	{
		if(!(obj instanceof Student))
			throw new RuntimeException("不属于stduent类");

		Student s=(Student)obj;
		if(this.age > s.age)
			return 1;
		if(this.age ==s.age)
		{
			return this.name.compareTo(s.getName());
		}

		return -1;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
         return age;
	}
}