黑马程序员 TreeSet集合里的对象需要自定义compareTo方法

----------------------  android培训 java培训 、期待与您交流! ----------------------


TreeSet集合底层的数据结构是二叉树,如图,往里存放数据都从22开始判断放左边还是放右边,遍历的时候第1个18是第9个是90。这个结构在存数据的时候比较快捷,减少了挨个比较的次数。
黑马程序员    TreeSet集合里的对象需要自定义compareTo方法 - s - s的学习记录
 
 

作为Set集合的子类,TreeSet也不能存储重复元素,而且他要求存入的对象必须实现compareTo方法,不然他无法决定每个元素在二叉树里的位置,会报这个错:
Exception in thread "main" java.lang.ClassCastException: Student cannot be cast  to java.lang.Comparable
而当只存入一个数据时不会报错,因为不需比较, compareTo方法是存第二个元素开始才逐个调用的。

下面代码示例:
import java.util.*;
/*
 * 往TreeSet存学生对象
 * 按学生年龄顺序取出,学生名字作为次要顺序

 * 同名同年龄视为同一个对象
 */
class TreeSetTest
{
	public static void main(String[] a)
	{
		TreeSet v = new TreeSet(); //创建集合
		v.add(new Student("a12",12)); //添加元素
		v.add(new Student("c32",32));
		v.add(new Student("h13",13));
		v.add(new Student("t13",13));
		v.add(new Student("h13",13));
		Iterator t =v.iterator();
		showSet(v);
	}
	public static void showSet(TreeSet s) //只是用来打印每个元素里的变量
	{
		Iterator t =s.iterator(); //迭代器
		while(t.hasNext())
		{
			Student stu=(Student)t.next();
		}
	}

	public static void sop(Object b)
	{
		System.out.println(b);
	}
}
class Student implements Comparable
{
	public int compareTo(Object b) throws RuntimeException
	{
		if(!(b instanceof Student))
			throw new RuntimeException("不是学生对象");
		Student s=(Student)b; //强制转换类型
		if(this.age<s.age)return -1; //小于就返回负数
		if(this.age==s.age)return this.name.compareTo(s.name);//年龄相同的判断名字

								//字符串已经含compareTo方法,按自然顺序比
		return 1;//大于就走这里返回正数
	}
	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;
	}
}


输出结果:
a12...12
h13...13
t13...13
c32...32


而当TreeSet添加的元素是String类型的,即 v.add( "hhgg" );这 时会自动排序,因为String类型已经按自然顺序复写过compareTo方法。

另外,如果想让集合里元素的顺序与执行代码的顺序相同,可以这样复写compareTo:(其实没什么意义,且会重复元素)

public int compareTo(Object b)

{

return 1;//每次进来的元素都排在前一个元素的后面
}

输出结果:
a12...12
c32...32
h13...13
t13...13
h13...13

 -------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值