A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.util.*;

  2. class TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts = new TreeSet();


  7.                 ts.add(new Student("lisi02",22));
  8.                 ts.add(new Student("lisi007",20));
  9.                 ts.add(new Student("lisi09",19));
  10.                 ts.add(new Student("lisi01",40));


  11.                 Iterator it = ts.iterator();

  12.                 while (it.hasNext())
  13.                 {
  14.                         System.out.println(it.next());
  15.                 }
  16.         }
  17. }
  18. class Student
  19. {
  20.         private String name;
  21.         private int age;

  22.         Student(String name,int age)
  23.         {
  24.                 this.name = name;

  25.                 this.age = age;
  26.                
  27.         }
  28.         public String getName()
  29.         {
  30.                 return name;
  31.         }
  32.         public int getAge()
  33.         {
  34.                 return age;
  35.        
  36.         }
  37.        
  38.        
  39. }
复制代码

以上是原代码,和毕老师视频里面的一样,编译时,也出现了类型转换异常,按毕老师视频里面的做法,保留一个对象,编译时,又爆出类型转换异常,可是和毕老师视频中的结果不一样,我就不理解了,跪求各路大神解答!!:kiss:么么哒~

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

15 个回复

倒序浏览
  1. import java.util.*;

  2. class TreeSetDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts = new TreeSet();


  7.                 ts.add(new Student("lisi02",22));
  8.                 ts.add(new Student("lisi007",20));
  9.                 ts.add(new Student("lisi09",19));
  10.                 ts.add(new Student("lisi01",40));


  11.                 Iterator it = ts.iterator();

  12.                 while (it.hasNext())
  13.                 {
  14.                                         Student stu = (Student)it.next();
  15.                         System.out.println(stu.getName() + ";;" + stu.getAge());
  16.                 }
  17.         }
  18. }
  19. class Student implements Comparable//让学生具有比较性。
  20. {
  21.         private String name;
  22.         private int age;

  23.         Student(String name,int age)
  24.         {
  25.                 this.name = name;

  26.                 this.age = age;
  27.                
  28.         }
  29.                 public int compareTo(Object obj)//复写接口的方法。
  30.                 {
  31.                         if(!(obj instanceof Student))
  32.                                 throw new RuntimeException();
  33.                         Student stu = (Student)obj;
  34.                         int num = (new Integer(this.age)).compareTo(new Integer(stu.age));
  35.                         if( num == 0)
  36.                                 num = this.name.compareTo(stu.name);
  37.                         return num;
  38.                 }
  39.         public String getName()
  40.         {
  41.                 return name;
  42.         }
  43.         public int getAge()
  44.         {
  45.                 return age;
  46.         
  47.         }
  48.         
  49.         
  50. }
复制代码
回复 使用道具 举报

这是后面的代码,你没看懂我的意思。我是说在毕老师最开始演示的时候,出现的结果不一样
回复 使用道具 举报

我其实是想表达  我存一个对象,都会报类型转换异常,毕老师的视频里面,他存一个不存在这个问题
回复 使用道具 举报
首先,楼主没有用泛型,会出现一对黄线,虽然没报错,看着不爽,最好用上泛型,可以省去第20行的类型转换。
其次,也是最重要的,楼主要查看笔记或者API找到TreeSet的特性。
         1. TreeSet底层机构是二叉树,这个集合是要按照某种规则对元素进行排序。
                    排序有两种方法:(1) 让元素所属的类实现Comparable接口。
                                                (2) 在创建集合的时候,在构造参数中传递Comparator接口的子类对象。
         2. 元素要保证唯一性。

上面二楼是用的第一种方法:让元素所属的类实现Comparable接口排序。
一般在应用上经常采用的是第二种方法,这样不用去修改元素所属类。下面是我的代码:
import java.util.Comparator;
import java.util.TreeSet;

class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
                                @Override
                                public int compare(Student s1, Student s2) {                                      
                                        int num = s1.getAge() - s2.getAge();        // 主要条件:年龄。先按照年龄排序。
                                        int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;        // 次要条件:姓名。再按照姓名排序。
                                        return num2;
                                }
                        });

                ts.add(new Student("lisi02",22));
                ts.add(new Student("lisi007",20));
                ts.add(new Student("lisi09",19));
                ts.add(new Student("lisi01",40));

                //这里我用了增强for遍历,代码简单方便,下面也有用迭代器遍历的代码,注释了。
                for(Student s : ts){
                        System.out.println(s.getName()+"---"+s.getAge());
                }

                  // 迭代器遍历               
//                Iterator<Student> it = ts.iterator();
//                while (it.hasNext())
//                {
//                        Student s = it.next();
//                    System.out.println(s.getName()+"---"+s.getAge());
//                }
        }
}
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;

        }      
}


回复 使用道具 举报
蛤蟆太康 发表于 2014-5-8 13:59
首先,楼主没有用泛型,会出现一对黄线,虽然没报错,看着不爽,最好用上泛型,可以省去第20行的类型转换。 ...

我其实是想表达  我存一个对象,都会报类型转换异常,毕老师的视频里面,他存一个不存在这个问题
回复 使用道具 举报
会说话的木头 发表于 2014-5-8 14:28
我其实是想表达  我存一个对象,都会报类型转换异常,毕老师的视频里面,他存一个不存在这个问题 ...

你看一下是哪一行报错出异常了,再跟毕老师的代码对比一遍,看看哪里出错了不一样的。实在找不到就断点调试一下。其实用了“泛型”就不会出现“类型转换异常”的错误了。
回复 使用道具 举报
我也遇见这个问题了,本来说艾特你去看看的,发现艾特没有变化。不知道你现在解决问题了没有
回复 使用道具 举报
彭飞 发表于 2014-5-8 16:04
我也遇见这个问题了,本来说艾特你去看看的,发现艾特没有变化。不知道你现在解决问题了没有 ...

毕老师报的是第二个new Student,我是第一个new Student,毕老师把下面的都注释掉,就留一个可以存进去,我也是这样,结果就报类型异常
   我再考虑是不是 JDK的版本升级的原因 老师的版本较低!
回复 使用道具 举报
蛤蟆太康 发表于 2014-5-8 14:34
你看一下是哪一行报错出异常了,再跟毕老师的代码对比一遍,看看哪里出错了不一样的。实在找不到就断点调 ...

其实就是非常简单的一个问题,毕老师报的是第二个new Student,我是第一个new Student,毕老师把下面的都注释掉,就留一个可以存进去,我也是这样,结果就报类型异常
   我再考虑是不是 JDK的版本升级的原因 老师的版本较低!
回复 使用道具 举报
我很好奇、毕老师存一个能存进去? 你Student类都不具备比较性,能存TreeSet集合吗? 报的是这个异常吧!?(Student cannot be cast to java.lang.Comparable)
回复 使用道具 举报
无奈的年华ˊ 发表于 2014-5-9 09:43
我很好奇、毕老师存一个能存进去? 你Student类都不具备比较性,能存TreeSet集合吗? 报的是这个异常吧!? ...

老师能存一个 我不能
回复 使用道具 举报
你确定能存!? 我是存不了。你那对象都不具备比较性怎么可能可以存。 哪一节视频
回复 使用道具 举报
无奈的年华ˊ 发表于 2014-5-9 11:06
你确定能存!? 我是存不了。你那对象都不具备比较性怎么可能可以存。 哪一节视频 ...

15天-02!!!!

QQ截图20140509111057.png (7.26 KB, 下载次数: 27)

QQ截图20140509111057.png
回复 使用道具 举报

好吧、我搞不明白!我运行不了,但是发给我朋友他又可以!代码一点都没动。

点评

据说是JDK版本的原因、我的是1.7的 他的是1.6的  发表于 2014-5-9 16:47
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马