您的位置:首页 > 职场人生

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

2013-06-24 21:39 323 查看
---------------------- android培训java培训、期待与您交流!
----------------------

TreeSet集合底层的数据结构是二叉树,如图,往里存放数据都从22开始判断放左边还是放右边,遍历的时候第1个18是第9个是90。这个结构在存数据的时候比较快捷,减少了挨个比较的次数。



作为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培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐