黑马程序员技术交流社区

标题: TreeSet 结果怎么不安顺序输出? 求解释 [打印本页]

作者: 贠(yun)靖    时间: 2012-3-18 00:50
标题: TreeSet 结果怎么不安顺序输出? 求解释
import java.util.*;
class TreeSetDemo15_1
{
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet();
                ts.add (new Student("lisi03",39));
                ts.add (new Student("lisi03",40));
                ts.add (new Student("lisi007",20));
                ts.add (new Student("lisi02",22));
                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==age)  //年龄条件是主要条件
                       
                        return this.name.compareTo(s.name);  //比较名字是否相同时次要条件
                return -1;
        }

        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}

lisi007:::::20
lisi02:::::22
lisi03:::::39
lisi03:::::40
lisi09:::::19

怎么会这样子输出呢?    应该是先判断年龄  从小到大排啊
如果年龄相同 在比较name的值啊  我这怎么全乱了  找了半天找不出来原因   
  这的知识都懂,就是结果出现问题  也找不出个所以然来 ~~!
输出完毕 (耗时 0 秒) - 正常终止
作者: 梁锡伟    时间: 2012-3-18 00:54
  System.out.println(this.name+"...compareto...."+s.name);

你没发现这句话完全没输出吗?也就是compare根本就没执行过,自己找找为什么没执行的原因吧
作者: 贠(yun)靖    时间: 2012-3-18 01:00
梁锡伟 发表于 2012-3-18 00:54
System.out.println(this.name+"...compareto...."+s.name);

你没发现这句话完全没输出吗?也就是compar ...

比较了 我把那个比较的结果没放到帖子里  
作者: H07000223    时间: 2012-3-18 01:02
package test;

import java.util.Iterator;
import java.util.TreeSet;

public class Test_01
{
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet();
                ts.add(new Student("lisi03", 39));
                ts.add(new Student("lisi03", 40));
                ts.add(new Student("lisi007", 20));
                ts.add(new Student("lisi02", 22));
                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());
                }
        }
}

@SuppressWarnings("rawtypes")
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;
        }
}

作者: 梁锡伟    时间: 2012-3-18 01:04
H07000223 发表于 2012-3-18 01:02
package test;

import java.util.Iterator;

;P原来是lz粗心
作者: H07000223    时间: 2012-3-18 01:06
梁锡伟 发表于 2012-3-18 01:04
原来是lz粗心

通常都是这样~~~
作者: 李爱军    时间: 2012-3-18 01:07
本帖最后由 李爱军 于 2012-3-18 01:08 编辑

import java.util.*;
public class TreeSetDemo15_1
{
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet();
                ts.add (new Student("lisi03",39));
                ts.add (new Student("lisi03",40));
                ts.add (new Student("lisi007",20));
                ts.add (new Student("lisi02",22));
                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;
        }
        @Override
        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)// 楼主--是s.age 不是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;
        }
}

/**
* lisi03...compareto....lisi03
lisi007...compareto....lisi03
lisi02...compareto....lisi03
lisi02...compareto....lisi007
lisi09...compareto....lisi03
lisi09...compareto....lisi007
lisi09:::::19
lisi007:::::20
lisi02:::::22
lisi03:::::39
lisi03:::::40

*/
----------------- if (this.age>s.age)// 楼主-------是s.age 不是age

作者: 魏群    时间: 2012-3-18 01:09
本帖最后由 魏群 于 2012-3-18 01:17 编辑

if (this.age>s.age)
                        return 1;
                if (this.age==age)  //年龄条件是主要条件
                        
                        return this.name.compareTo(s.name);  

你的age和name是private的 比较时应该用s.getAge()和s.getName();


帮你改了下比较方法 另外用泛型啊会舒服很多。
import java.util.*;
class TreeSetDemo15_1
{
        public static void main(String[] args)
        {
                TreeSet<Student> ts = new TreeSet<Student>();  //泛型
                ts.add (new Student("lisi03",39));
                ts.add (new Student("lisi03",40));
                ts.add (new Student("lisi007",20));
                ts.add (new Student("lisi02",22));
                ts.add (new Student("lisi09",19));
                //ts.add (new Student("lisi08",19));

                Iterator<Student> it = ts.iterator();   //泛型
                while (it.hasNext())
                {
                        Student stu = it.next();
                        System.out.println(stu.getName()+":::::"+stu.getAge());
                }
        }
}
class Student implements Comparable<Student> //该接口强制让学生具备比较性  //泛型
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public int compareTo(Student stu)  //帮你改的比较方法
     {
        System.out.println(name+"...compareto...."+stu.getName());
        int i = new Integer(age).compareTo(new Integer(stu.getAge()));
        if(i == 0)
             return name.compareTo(stu.getName());
                return i;
        }

        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}

作者: 丁佼    时间: 2012-3-18 01:27
if (this.age==age)  //年龄条件是主要条件
这句应该是this.age==s.age

果然还是多来这边学东西。。看了代码又去看视频学比较器。。发现自己把 Comparable和 Compartor都忘了。。。感谢LZ,借机加强记忆了一下。
半小时。最终排查出错误不是算法或者函数使用错误。。是您老打字少了两个字母。。。。
作者: liumeng    时间: 2012-3-18 07:39

import java.util.*;
class TreeSetDemo15_1
{
        public static void main(String[] args)
        {
                TreeSet ts = new TreeSet();
//                ts.add("45");
//                ts.add("12");
//                ts.add("34");
               
                ts.add (new Student("lisi03",39));
                ts.add (new Student("lisi09",19));
                ts.add (new Student("lisi03",40));
                ts.add (new Student("lisi007",20));
                ts.add (new Student("lisi02",22));
              
              //  ts.add (new Student("lisi08",19));
             // System.out.println(ts);
                Iterator it = ts.iterator();
                while (it.hasNext())
                {
                        //String name=(String)it.next();
                        //System.out.println(name);
                       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;
                       
                        }else if(this.age<s.age)
                        {
                                return -1;
                        }else
                        {
                                return this.name.compareTo(s.name);        
                        }
                         //比较名字是否相同时次要条件
              
        }

        public void setName(String name) {
                        this.name = name;
                }
                public void setAge(int age) {
                        this.age = age;
                }
                public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}


作者: 薛波    时间: 2012-3-18 08:27
  if (this.age>s.age)
                        return 1;
                if (this.age==age)  //年龄条件是主要条件

错误主要是你比较时没有把要比较的对象进行比较,而是自己和自己进行比较所以就出现了这种问题




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