黑马程序员技术交流社区

标题: TreeSet 集合问题 [打印本页]

作者: 黑马19我最牛    时间: 2013-4-9 01:18
标题: TreeSet 集合问题
本帖最后由 许兵兵 于 2013-4-9 21:03 编辑
  1. package cn.itcast.test;
  2. import java.util.TreeSet;

  3. public class TreeSteDome11 {
  4.         //TreeSet  集合特点是,集合中没有相同的元素,并且集合中的元素有顺序,按照自然排序的方法排序
  5.         public static void main(String[] args) {
  6.                 TreeSet t2=new TreeSet();   //创建一个TreeSet集合  
  7.                 t2.add(new person("zhangsan1",21));  //给集合中增加元素
  8.                 t2.add(new person("zhangsan2",23));
  9.                 t2.add(new person("zhangsan4",24));
  10.                 t2.add(new person("zhangsan1",21));
  11.                 t2.add(new person("zhangsan3",23));
  12.                 System.out.println(t2);

  13.         }

  14. }
  15. //创建一个Person 类,并实现Comparable 接口,这样一来这个类就具有了自己的排序方法
  16. class person implements Comparable{
  17.         public String getName() {
  18.                 return name;
  19.         }
  20.         public void setName(String name) {
  21.                 this.name = name;
  22.         }
  23.         public int getAge() {
  24.                 return age;
  25.         }
  26.         public void setAge(int age) {
  27.                 this.age = age;
  28.         }
  29.         private String name;
  30.         private int age;
  31.         public person(String name, int age) {
  32.                 super();
  33.                 this.name = name;
  34.                 this.age = age;
  35.         }
  36.         //复写compareTo  ,建立自己的排序方法   以年龄为主要条件,姓名为次要条件,
  37.         public int compareTo(Object obj){
  38.                 person p=(person)obj;
  39.                 int num=this.age -p.age ;  //根据年龄排列
  40.                 return (num==0)?this.compareTo(p):num;   //如果年龄相同,再根据他们的姓名排列
  41.         }
  42.         //复写toString  ,建立自己的输出方式
  43.         public String toString(){
  44.                 return this.name +"..."+this.age ;
  45.         }
  46.         
  47. }
复制代码
郁闷啊,怎么都找不到问题在什么地方,一运行就报错,也不知道报错爆的是什么意思!
崩溃死!


异常信息:
Exception in thread "main" java.lang.StackOverflowError
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:41)
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:43)
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:43)
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:43)
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:43)
        at cn.itcast.test.person.compareTo(TreeSteDome11.java:43)



作者: luguoyuanf    时间: 2013-4-9 01:30
return (num==0)?this.compareTo(p):num;   //如果年龄相同,再根据他们的姓名排
这个是return num==0?this.name.compareTo(p.name):num;
作者: 黄小贝    时间: 2013-4-9 02:40
楼上正解



但是不建议使用这种写法,因为可读性略差,容易把自己绕晕
作者: 黄玉昆    时间: 2013-4-9 07:56
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 黑马19我最牛    时间: 2013-4-9 21:03
黄小贝 发表于 2013-4-9 02:40
楼上正解

哦,明白了!那你建议用什么写法?
作者: 黄小贝    时间: 2013-4-9 21:33
许兵兵 发表于 2013-4-9 21:03
哦,明白了!那你建议用什么写法?

老老实实的if吧,我看过不少源码的确有你这样的写法,情况不复杂的确看起来很爽,如果对自己功底自信就这样写,如果不太熟,就 if 然后 return,虽然笨,但是出错率低




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2