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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贠(yun)靖 高级黑马   /  2012-3-18 00:50  /  4797 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 秒) - 正常终止

10 个回复

正序浏览
  if (this.age>s.age)
                        return 1;
                if (this.age==age)  //年龄条件是主要条件

错误主要是你比较时没有把要比较的对象进行比较,而是自己和自己进行比较所以就出现了这种问题
回复 使用道具 举报
丁佼 黑马帝 2012-3-18 01:27:14
10#
if (this.age==age)  //年龄条件是主要条件
这句应该是this.age==s.age

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

点评

哥们,给力。  发表于 2012-3-18 01:31
回复 使用道具 举报
魏群 黑马帝 2012-3-18 01:09:49
9#
本帖最后由 魏群 于 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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李爱军 于 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

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
梁锡伟 发表于 2012-3-18 01:04
原来是lz粗心

通常都是这样~~~
回复 使用道具 举报
H07000223 发表于 2012-3-18 01:02
package test;

import java.util.Iterator;

;P原来是lz粗心
回复 使用道具 举报
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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
梁锡伟 发表于 2012-3-18 00:54
System.out.println(this.name+"...compareto...."+s.name);

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

比较了 我把那个比较的结果没放到帖子里  
回复 使用道具 举报
  System.out.println(this.name+"...compareto...."+s.name);

你没发现这句话完全没输出吗?也就是compare根本就没执行过,自己找找为什么没执行的原因吧
回复 使用道具 举报

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

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马