黑马程序员技术交流社区

标题: TreeSet小例子、为什么存入的第一个元素也进行自身比较? [打印本页]

作者: 杨华威    时间: 2012-3-29 20:26
标题: TreeSet小例子、为什么存入的第一个元素也进行自身比较?

import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet();

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

                Iterator it = ts.iterator();
                while(it.hasNext())
                {

                        Student stu = (Student)it.next();
                        System.out.println(stu.getName()+"...."+stu.getAge());
                }
        }
}
class Student implements Comparable //该接口签字让学生对象具备较性。
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
        public int compareTo(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new RuntimeException("不是学生对象");
                Student s =(Student)obj;
               
                System.out.println(this.name+"....compareto...."+s.name);
                if (this.age>s.age)
                        return 1;
                if(this.age == s.age)
                {
                        return this.name.compareTo(s.name);
                }
                return -1;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
       
}
------------------------------

lisi01....compareto....lisi01
lisi02....compareto....lisi01
lisi09....compareto....lisi01
lisi09....compareto....lisi02
lisi08....compareto....lisi02
lisi08....compareto....lisi09
lisi08....19
lisi09....19
lisi02....20
lisi01....22


为什么存入的第一个元素也进行和自身比较?
作者: 龚龙    时间: 2012-3-29 20:41
本帖最后由 龚龙 于 2012-3-29 20:43 编辑

System.out.println(this.name+"....compareto...."+s.name);
你是这么写的,在你的TreeSet中的只有一个元素的时候this.name的值是lisi01,s.name的值也是lisi01;不是说他出现了和自身比较的情况,只是你有打印这句话的代码而已!
你不想让这句话出现,你加上一个判断TreeSet的长度就行了.
this表示的对当前对象的引用!
作者: 肖发腾    时间: 2012-3-29 20:42
比较器取treeset中的第一个元素进行比较,第一个元素就是它本身了,在比较算法中自身与自身比较是很常见的吧。这是比较算法决定的,不用去生活中的道理去想吧,就是自己先和自己比较,再和下一个比较。数据中的第一个数,有些时候可以通过代码的调整不和本身进行比较,有些时候则不能。
作者: 乔玉吉    时间: 2012-3-29 21:58
本帖最后由 乔玉吉 于 2012-3-29 22:15 编辑

应该是这样的,当内存中没有其他对象比较的时候,又恰恰对象本身具有可比性 ,就只能和自己比较教了
我认为既然继承了comparable,每次new对象都会做比较动作.

流程:

当执行到这句话的时候 ts.add(new Student("lisi01",22));

内存中就有了Student类的实例,new Student("lisi01",22))这个实例就具备了类中的成员变量和方法,并同时给成员变量赋值;
这时候 this.name就是lisi01,age就是22,,这时候还没有其他Studetn类的实例存在,我想compareTo方法每次new对象都会执行的,这时候没有其他实例存在只能调用自身对象了
s.name也就成了lisi01

当再次new Student("lisi02",20))新的实例时,内存中就又会开辟新的空间,this.name就是自身实例的name,就是lisi02 ,
这时候内存中出现了两个实例,因为他们具备可比性,所以这个新的实例对象会调用其compareTo方法,并把lisi01对象传进来进行比较,s.name就是lisi01了.

再次new对象,就会再次和之前new过的对象进行比较,也就打印出你说的那种结果

作者: 杨华威    时间: 2012-3-30 12:28
乔玉吉 发表于 2012-3-29 21:58
应该是这样的,当内存中没有其他对象比较的时候,又恰恰对象本身具有可比性 ,就只能和自己比较教了
我认为既 ...

我看教程里面,毕老师写的同样的代码,他的第一个对象就没有自身比较……
作者: 乔玉吉    时间: 2012-3-30 12:46
杨华威 发表于 2012-3-30 12:28
我看教程里面,毕老师写的同样的代码,他的第一个对象就没有自身比较…… ...

比较的 你可以去看毕老师源码 在群里就有的下载 (源码new的第一个学生名字是lisi02)

这是源码的打印结果:

lisi02....compareto.....lisi02
lisi007....compareto.....lisi02
lisi09....compareto.....lisi02
lisi09....compareto.....lisi007
lisi08....compareto.....lisi007
lisi08....compareto.....lisi09
lisi08...19
lisi09...19
lisi007...20
lisi02...22
作者: newlaw2013    时间: 2012-3-30 14:04
我运行了楼主的代码,结果是:

lisi02....compareto....lisi01
lisi09....compareto....lisi01
lisi09....compareto....lisi02
lisi08....compareto....lisi02
lisi08....compareto....lisi09
lisi08....19
lisi09....19
lisi02....20
lisi01....22

没有自己和自己比较啊?难道是运行环境的问题,查一下版本吧?
我的是:
java version "1.6.0_27"
Java(TM) SE Runtime Environment (build 1.6.0_27-b07)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode)
作者: 杨华威    时间: 2012-3-30 16:27
newlaw2013 发表于 2012-3-30 14:04
我运行了楼主的代码,结果是:

lisi02....compareto....lisi01

同样都是老师的代码,我的出现了自身比较,你的和老师的一样,没有自身比较。神马原因?
作者: 杨华威    时间: 2012-3-30 16:33
乔玉吉 发表于 2012-3-30 12:46
比较的 你可以去看毕老师源码 在群里就有的下载 (源码new的第一个学生名字是lisi02)

这是源码的打印结果 ...

恩,老师在视频上打印的时候的确是没有进行自身比较的。
可能是版本的问题吧?或者运行环境……
是这一节教程:
黑马程序员_毕向东_Java基础视频教程第15天-02-集合框架(TreeSet存储自定义对象).avi
下面是视频教程的截图:(没有进行自身比较)

作者: 乔玉吉    时间: 2012-3-30 17:35
杨华威 发表于 2012-3-30 16:33
恩,老师在视频上打印的时候的确是没有进行自身比较的。
可能是版本的问题吧?或者运行环境……
是这一节 ...

也许吧,这个问题以后慢慢研究
作者: 黄秋    时间: 2012-3-30 19:05
newlaw2013 发表于 2012-3-30 14:04
我运行了楼主的代码,结果是:

lisi02....compareto....lisi01

我运行的与你一样,也没与自身比较,版本是:java version "1.6.0_24"
作者: 杨华威    时间: 2012-3-30 21:08
黄秋 发表于 2012-3-30 19:05
我运行的与你一样,也没与自身比较,版本是:java version "1.6.0_24"

谢谢大家了,可能是版本的问题;新版本出现了一些新特性吧,可能。
我的版本是
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b05)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing)
作者: 杨华威    时间: 2012-3-30 21:09
newlaw2013 发表于 2012-3-30 14:04
我运行了楼主的代码,结果是:

lisi02....compareto....lisi01

谢谢大家了,可能是版本的问题;新版本出现了一些新特性吧,可能。
我的版本是
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b05)
Java HotSpot(TM) Client VM (build 22.1-b02, mixed mode, sharing)




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