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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭飞 中级黑马   /  2014-5-8 15:31  /  1413 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看毕老师视频,  15天集合框架(TreeSet存储自定义对象) 出现了一些差异。

9 个回复

倒序浏览
先给出视频里的原代码。
回复 使用道具 举报


这2个是毕老师视频里的代码,其中只有第一行有一句没有在截图范围内:就是 import java.util.*;

视频里毕老师运行多行add时报错,当只运行一行add时候,成功编译。

然后我用Editplus 反复尝试了几次 都不能实现如此功能,
后来又把代码 复制到 MyEclipse  中,一样不可以执行。

然后我又一字一字对照,发现没有写错,
并有重开文档再次书写,结果一样,
这个时候我开始考虑到是不是JKD版本问题,
毕老师的视频是2011年的,那会是6.0  现在都用的是7.0版本的JDK。

然后我继续看视频,比老师讲解到 根据报错查看API发现Comparable特性就是
     在实现该接口的时候会强行对对象进行排序,并提供给我们一个方法compareTo来实现。

然后我按照新学的知识再次应用到自己的代码上,这个时候进行2次add的时候,实现了功能,
当我实现3次add的时候,却有出现了差异,结果只输出了2个结果,
我就不能淡定了。
回复 使用道具 举报
import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet();
                ts.add(new Student("lisi02",22));
                //ts.add(new Student("lisi007",20));
                //ts.add(new Student("lisi09",19));
                //ts.add(new Student("lisi01",40));
                Iterator it=ts.iterator();
                while(it.hasNext()){
                        System.out.println(it.next());
                }
                /*
                for(Iterator it=ts.iterator();it.hasNext(); ){
                        System.out.println(it.next());
                }
                */
        }
}

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;
        }

}
这是实现Comparable前的代码。
回复 使用道具 举报

  1. import java.util.*;
  2. class Student implements Comparable//该接口让学生类具有必将性
  3.         {
  4.         private String name;
  5.         private int age;
  6.         Student(String name,int age){
  7.                 this.name=name;
  8.                 this.age=age;
  9.         }
  10.         public int compareTo(Object obj){
  11.                 if(!(obj instanceof Student))
  12.                         throw new RuntimeException(" - - !!!");
  13.                 Student s=(Student)obj;
  14.                 if(this.age>s.age)
  15.                         return 1;
  16.                 if(this.age==s.age)
  17.                         return 0;
  18.                 return -1;
  19.         }
  20.         public String getName(){
  21.                 return name;
  22.         }
  23.         public int getAge(){
  24.                 return age;
  25.         }
  26. }
  27. class _2TreeSetTest2
  28. {
  29.         public static void main(String[] args) {
  30.                 TreeSet  ts=new TreeSet();
  31.                 ts.add(new Student("lisi02",22));
  32.                 ts.add(new Student("lisi009",20));
  33.                 ts.add(new Student("lisi007",20));
  34.                 Iterator it=ts.iterator();
  35.                 while(it.hasNext()){
  36.                         Student s=(Student)it.next();
  37.                         sop(s.getName()+"..."+s.getAge());
  38.                 }
  39.         }
  40.         public static void sop(Object obj)
  41.         {
  42.                 System.out.println(obj);
  43.         }
  44. }

复制代码


这时候是有2句 add时候,运行出2个结果,当3add时候,结果却是:  09  和09   那两句
回复 使用道具 举报
还请各位,接解决下,问题所在,

是代码的输入错误,还是没有专心看视频,有漏掉的地方,

还是我推测的,是版本特性问题,

或者还是其他的问题。

首先声明下,该视频讲解的是 Set  集合   下 TreeSet    ,
回复 使用道具 举报
@会说话的木头   你也出现这个问题了,  囧。
回复 使用道具 举报
-0-  没人知道怎么回事儿么。

刚刚看了看API ,6.0到7.0  也没有对该接口出现过新的优化啊。  

真是纠结死了。
回复 使用道具 举报
哥们,,我把你的代码拷贝到我myeclipse中 ,运行的好好的啊 ,没有发现什么问题啊,不清楚你那是什么问题。
你把你出现的问题也贴出来,否则真不知道怎么解决
回复 使用道具 举报
问题一:第二张图看不了呢。。。。。。不过代码没有问题啊。没有添加comparaTo()方法前确实不能添加第二个数据啊。以为他不知道按照什么排序啊,所以会报错啊。
问题二:然后我按照新学的知识再次应用到自己的代码上,这个时候进行2次add的时候,实现了功能,
当我实现3次add的时候,却有出现了差异,结果只输出了2个结果。
答:
  ts.add(new Student("lisi02",22));
  ts.add(new Student("lisi009",20));
  ts.add(new Student("lisi007",20));
看你的comparaTo()方法     按照年龄自然排序,年龄一样的就不添加了(你有两个年龄为20的数据,所以最后一个lisi007,20 没有添加呢)。所以你会打印出两个结果啊。
public int compareTo(Object obj){
                if(!(obj instanceof Student))
                        throw new RuntimeException(" - - !!!");
                Student s=(Student)obj;
                if(this.age>s.age)
                        return 1;
                if(this.age==s.age)
                        return 0;
                return -1;
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马