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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-23 10:26  /  1629 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-23 12:58 编辑
  1. import java.util.*;
  2. public class StudentMap
  3. {
  4.       
  5.         public static void main(String[] args)
  6.         {
  7.                 //HashMap<Student,String> hm=new HashMap<Student,String>();
  8.                 TreeMap<Student,String> tm=new TreeMap<Student,String>();
  9.                 tm.put(new Student("zhangsan01",20), "beijing");
  10.                 tm.put(new Student("zhangsan01",20), "beijing");
  11.                 tm.put(new Student("zhangsan01",20), "tianjin");
  12.                 tm.put(new Student("zhangsan02",22), "shanghai");
  13.                 tm.put(new Student("zhangsan03",23), "tianjin");
  14.                 Set<Map.Entry<Student,String>> hs=tm.entrySet();
  15.                 for(Iterator<Map.Entry<Student,String>> it=hs.iterator();it.hasNext();)
  16.                 {
  17.                         Map.Entry<Student, String> me=it.next();
  18.                         Student stu=me.getKey();
  19.                         String add=me.getValue();
  20.                         System.out.println(stu+"^"+add);                        
  21.                 }
  22.         }
  23. }
  24. class Student implements Comparable<Student>
  25. {
  26.         private String name;
  27.         private int age;
  28.         public String getName() {
  29.                 return name;
  30.         }
  31.         public void setName(String name) {
  32.                 this.name = name;
  33.         }
  34.         public int getAge() {
  35.                 return age;
  36.         }
  37.         public void setAge(int age) {
  38.                 this.age = age;
  39.         }
  40.         Student(String name,int age)
  41.         {
  42.                 this.name=name;
  43.                 this.age=age;
  44.         }
  45.         public int compareTo(Student s)//排序根据。
  46.         {
  47.                 int num=new Integer(this.age).compareTo (new Integer(this.name));
  48.                 if(num==0)
  49.                         return this.name.compareTo(s.name);
  50.                 return num;
  51.         }
  52.         public int hashCode()//要重写hashCode方法。尽量让每个元素的返回值不同。
  53.         {
  54.                 return this.name.hashCode()+age*10;
  55.         }
  56.         public boolean equals(Object obj)//重写equals方法。
  57.         {
  58.                 if(!(obj instanceof Student))
  59.                         throw new ClassCastException("类型不匹配");
  60.                 Student s=(Student) obj;
  61.                 return this.name.equals(s.name)&&(this.age==s.age);
  62.         }
  63.         public String toString()//打印对象需要调用这个方法。
  64.         {
  65.                 return this.name+":"+this.age;
  66.         }
  67. }
复制代码
为什么使用HashMap时完全正常,一改为TreeMap就报错呀?请高手指点。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
仔细看看你代码:出错位置 47
int num=new Integer(this.age).compareTo (new Integer(this.name));
int num=new Integer(this.age).compareTo (new Integer(this.age));
                        

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张豪杰 于 2013-3-23 10:44 编辑

你的compareTo方法里面有错
public int compareTo(Student s)//排序根据。

        {

               // int num=new Integer(this.age).compareTo (new Integer(this.name)); 这里你拿本对象的年龄和本对象的名字比,this.name是一个字符串,编译器没法将这个名字转换成对应的整形值,所以报出数据格式错误
               //改成这样
                int num = new Integer(this.age).compareTo(new Integer(s.age));
                if(num==0)

                        return this.name.compareTo(s.name);

                return num;

        }


现在来说说为什么用hashMap没问题,用treeMap就出问题了
你的compareTo方法,语法上没有错误,只是逻辑出错了,所以用hashMap的时候,编译器没有报错,因为没有调用compareTo方法
编译器也就不知道存在逻辑错误
而用treeMap,每次存放元素都会调用compareTo方法,所以一运行的时候就报错了!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
首先你代码就写错了 因为在HashMap中是通过HashCode和equals来比较对象 而在TreeMap中是通过比较器或者自然排序来比较对象 但是你自然排序中的代码有误 不可比较 所以就会出现你这种现象 你可以这样改               
int num = new Integer(this.age).compareTo(new Integer(s.age));
             if(num==0)
            return this.name.compareTo(s.name);
   return num

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

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