黑马程序员 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方法是存第二个元素开始才逐个调用的。
下面代码示例:
输出结果:
a12...12
h13...13
t13...13
c32...32
而当TreeSet添加的元素是String类型的,即v.add("hhgg");这时会自动排序,因为String类型已经按自然顺序复写过compareTo方法。
另外,如果想让集合里元素的顺序与执行代码的顺序相同,可以这样复写compareTo:(其实没什么意义,且会重复元素)
输出结果:
a12...12
c32...32
h13...13
t13...13
h13...13
--------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
----------------------
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培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_自定义学生类需要的几个必备的方法
- 黑马程序员一在hashSet集合中比较对象需要覆盖的两个方法hashCode(),equlas()
- TreeSet的自然排序(自定义对象 compareTo方法)
- 【原创】关于java对象需要重写equals方法,hashcode方法,toString方法 ,compareto()方法的说明
- 黑马程序员------常用API-常见对象需要练习的方法列表
- 重写对象equals和compareTo方法
- 黑马程序员 集合里的对象所属类要按需求重写equals方法
- Android 客户端调用基于XFire的webService方法传递自定义对象
- 黑马程序员--面向对象基础:属性和方法
- [翻译]怎么使用LINQ方法来比较自定义类型对象
- 使用HashSet 存储自定义对象,为什么需要重写hashCode()和equals()?
- 【PHP小错误整理】在类面调用自定义方法需要注意的问题
- 往TreeMap和TreeSet里添加自定义对象的两种比较方法
- [翻译]如何使用LINQ方法来比较自定义类型的对象
- 深入浅出Javascript(三)创建自定义对象以及属性、方法
- 自定义一个UITableViewHeaderFooterView、UITableViewCell需要注意的一些方法。
- 对象相等性——如何给自定义对象添加equals和hashCode方法
- JS中创建自定义对象的方法
- JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
- JS创建 trim() 方法,此方法在IE7、IE8中不存在 需要自定义