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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李月 中级黑马   /  2012-4-21 09:25  /  2813 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class StuNameCompare implements Comparator<Student>//此处为什么继承Comparator接口?{        public int compare(Student s1,Student s2)
        {
                int num=s1.getName().compareTo(s2.getName());
                if(num==0)
                        return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
                return num;
                       
        }
}
class  Maptest2
{
        public static void main(String[] args)
        {
                TreeMap<Student,String> tm=new TreeMap<Student,String>(new StuNameCompare());

                tm.put(new Student("lisi1",21),"beiing");
                tm.put(new Student("lisi2",20),"beiijng");
                tm.put(new Student("lisi3",24),"beiwwing");
                tm.put(new Student("lisi4",25),"beiinfg");

                Set<Map.Entry<Student,String>> entrySet=tm.entrySet();

                Iterator<Map.Entry<Student,String>> iter=entrySet.iterator();

                while(iter.hasNext())
                {

                        Map.Entry<Student,String> me=iter.next();
                        Student stu=me.getKey();
                        String addr=me.getValue();
                        System.out.println("key:"+stu+",value:"+addr);
                }
        }
}
class Student implements Comparable<Student>//此处为什么继承Comparable接口?{        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public int compareTo(Student s)
        {
                int num=new Integer(this.age).compareTo(new Integer(s.age));
                if(num==0)
                        return this.name.compareTo(s.name);
                return num;
        }
        public int hashCode()
        {
                return name.hashCode()+age*34;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                Student s=(Student)obj;
                return this.name.equals(s.name)&&this.age==s.age;

        }
        public String getName()
        {
                return name;
       
        }
        public int getAge()
        {
                return age;
        }
        public String toString()
        {
                return name+":"+age;
        }
               
}


当我们继成这两个接口时,要重写哪些方法?


5 个回复

倒序浏览
comparable&   Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)     而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
回复 使用道具 举报
朱鹏举 发表于 2012-4-21 09:34
comparable&   Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排 ...

明白一点了。
那这两个方法是必须写的吗?作用是什么?什么时候调用的?
public int hashCode()
        {
                return name.hashCode()+age*34;
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                        throw new ClassCastException("类型不匹配");
                Student s=(Student)obj;
                return this.name.equals(s.name)&&this.age==s.age;

        }
回复 使用道具 举报
comparato<T>r:用于使集合本身具有比较性;

该类下,只有两个个方法compare()和equals(),只要复写compare(T t1,T t2)就可以了;

comparable<T t>:用于使存入集合的对象所属的类具有比较性;

该类下,只有一个方法,compareTo(),只要复写它就可以了;
回复 使用道具 举报
补充一点,

你这边之所以要复写hashCode()和equals()方法,是应为改行代码Set<Map.Entry<Student,String>> entrySet=tm.entrySet();运行时,存入的Set集合不确定,可能是HashSet,也可能是TreeSet;
回复 使用道具 举报
Comparator用于集合比较
comparable用于类对象比较
一般对于没有覆盖Object的equals()和hashCode的都需要复写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马