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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-7-19 09:58  /  1644 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵阳 于 2012-7-19 11:16 编辑

第一个问题
这是一个TreeSet排序的代码。
import java.util.*;
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 this.name;
}
public int getAge()
{
  return this.age;
}
}
class Test
{
public static void sop(Object o)
{
  System.out.println(o);
}
public static void main(String[]args)
{
  TreeSet trr=new TreeSet();
  trr.add(new Student("lisi23",23));
  trr.add(new Student("lisi25",25));
  trr.add(new Student("llsi22",22));
  trr.add(new Student("lisi24",24));
  //trr.add(new Student("lisi24",24));
  //trr.add(new Student("lisi20",24));
  Iterator it=trr.iterator();
  while (it.hasNext())
  {
   Student stu=(Student)it.next();
   sop(stu.getName()+"::::"+stu.getAge());
  }
}
}
输出结果是
D:\java\zuoye\jihe_set>java Test
lisi23.......compareTo........lisi23         //我不明白这里为什么自己跟自己比较了一次,毕老师的怎么都没有比较啊。哪里不一样啊?怎么改正能够使自己跟自己不用比较一次啊?
lisi25.......compareTo........lisi23
llsi22.......compareTo........lisi23
lisi24.......compareTo........lisi23
lisi24.......compareTo........lisi25
llsi22::::22
lisi23::::23
lisi24::::24
lisi25::::25
第二个问题
import java.util.*;
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;
}
}
class Test
{
public static void sop(Object o)
{
  System.out.println(o);
}
public static void main(String[]args)
{
  TreeSet trr=new TreeSet(new MyCompare());
  trr.add(new Student("lisi23",23));
  trr.add(new Student("lisi25",25));
  trr.add(new Student("llsi22",22));
  trr.add(new Student("lisi24",24));
  Iterator it=trr.iterator();
  while (it.hasNext())
  {
   Student stu=(Student)it.next();
   sop(stu.getName()+"::::"+stu.getAge());
  }
}
}
class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
  Student s1=(Student)o1;
  Student s2=(Student)o2;
  return s1.getName().compareTo(s2.getName());
}
}
为什么输出结果是
D:\java\zuoye\jihe_set>java Test
lisi23::::23
lisi24::::24
lisi25::::25
llsi22::::22
不是按姓名排序吗,怎么最后一个没有排序啊?找不出问题所在啊?代码也没错啊

8 个回复

正序浏览
1、我们运行的时候,都没有出现自己和自己比较啊?

    你的如果出现这个问题,你可以这样写
      public int compareTo(Object obj) {                if (!(obj instanceof Student))
                        throw new RuntimeException("输入的类型不正确!");
                Student s = (Student) obj;
               
                /*
                 * 传入第一个student时,它会和自己比较一下,为了避免自己和自己比较
                 * 当发现是自己和自己比较时,直接返回0
                 */
                if(s==this){
                        return 0;
                }
               
               
                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;
        }



2、llsi22::::22    lisi23::::23   ->我debug ,发现  前者比后者大3,我无语了,一仔细看,
  原来是你写错了,  l 和i 比较 ;
   l ascii 是108  而 i 的是105。
回复 使用道具 举报
邵阳 发表于 2012-7-19 12:21
哥们你的没有自己跟自己比较吗?
我的每次都自己跟自己比较啊?
什么情况啊

我运行了很多次试了下,一次也没比较过
回复 使用道具 举报
邵阳 中级黑马 2012-7-19 12:21:05
7#
王宝康 发表于 2012-7-19 11:56
我运行了下,我这也不会跟自己比一次,等答案...

哥们你的没有自己跟自己比较吗?
我的每次都自己跟自己比较啊?
什么情况啊
回复 使用道具 举报
同学,第二个问题,答案来了,看下你的代码中加入对象的部分,
  1. TreeSet trr=new TreeSet(new MyCompare());
  2.   trr.add(new Student("lisi23",23));
  3.   trr.add(new Student("lisi25",25));
  4.   trr.add(new Student("llsi22",22));//这儿是李四吗,你这是llsi啊,至于结果还用解释吗?是排序了的,而且排序也是正确的,只是你这儿手误,写错了一个字母
  5.   trr.add(new Student("lisi24",24));
复制代码

评分

参与人数 1黑马币 +3 收起 理由
邵阳 + 3

查看全部评分

回复 使用道具 举报
邵阳 发表于 2012-7-19 11:17
凡能解决问题者给高分。

我运行了下,我这也不会跟自己比一次,等答案...
回复 使用道具 举报
凡能解决问题者给高分。
回复 使用道具 举报
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;
}
回复 使用道具 举报
Student s=(Student) obj;
  System.out.println(this.name+".......compareTo........"+s.name);
你这句话的意识就是当传进来的obj是Student类型时就打印。打印的是调用这个方法的对象的名字和传进来的对象的名字
treeSet集合是元素有序,不重复的,每次你存储一个对象进去。它都会跟跟其他的对象进行比较。也就是调用compare To方法。你重写了compare To方法。
它就会调用你重写的compare To方法,当你传进来第一个对象时,这个二叉树上面没有了,只有你一个对象。所有这个时候this和s都是这个对象。
当然打印出来的时候就会这样。为了程序的健全性,一般我们都会在比较之间做一个判断,用equals方法。判断传进来的对象是不是等于自己。
如果是的话就不添加进去,不做比较,这样的话会提高效率。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马