黑马程序员技术交流社区

标题: 请指教Map中键的排序问题 [打印本页]

作者: 杨增坤    时间: 2013-7-18 21:05
标题: 请指教Map中键的排序问题
public class Person implements Comparable<Person>{
        private String name;
        private int age;


        public Person(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }


        public String getName() {
                return name;
        }


        public int getAge() {
                return age;
        }
        public String toString(){
                return name+"-"+age;
        }
        public int compareTo(Person o) {
                int num=new Integer(this.age).compareTo(new Integer(o.age));
                if(num==0){
                        return this.name.compareTo(o.name);
                }
                return num;
        }
   public int hashCode(){
           return name.hashCode()+age*30;
   }
        public boolean equals(Object ob) {
                if (!(ob instanceof Person)) {
                        throw new ClassCastException("不是Person对象");
                }
                Person p = (Person) ob;
                return this.name.equals(p.name) && this.age == p.age;
        }
        public static void main(String [] s){
                HashMap<Person,String> map=new HashMap<Person,String>();
                map.put(new Person("zs1",22), "北京");
                map.put(new Person("zs2",23), "上海");
                map.put(new Person("zs3",23), "天津");
                map.put(new Person("zs4",24), "邯郸");
                map.put(new Person("zs4",24), "张家口");
                Set<Person> keys=  map.keySet();
                Iterator<Person> it=keys.iterator();
                while(it.hasNext()){
                        Person p=it.next();
                        System.out.println("键:"+p.toString()+"   值:"+map.get(p));
                }
        }        
}结果:
键:zs3-23   值:天津键:zs4-24   值:张家口键:zs2-23   值:上海键:zs1-22   值:北京
为什么结构的键不排序呢,实现接口 Comparable<Person>不就是为了让Person自身具有比较性吗,hashCode()和equals()方法是为了不能有重复的值,那为什么结果键不具有排序呢。
实现接口 Comparable<Person>的作用??
请各位指教!







作者: 夜默    时间: 2013-7-18 21:26
HashMap   底层是哈希表数据结构,你觉得用排序么
作者: 杨增坤    时间: 2013-7-18 22:02
巩建 发表于 2013-7-18 21:26
HashMap   底层是哈希表数据结构,你觉得用排序么

那实现实现接口 Comparable<Person>的作用??
作者: "O_忆_O    时间: 2013-7-18 22:29
forward 发表于 2013-7-18 22:02
那实现实现接口 Comparable的作用??

这是为了保证键的唯一性
作者: 陈雪琪    时间: 2013-7-18 22:35
我觉得楼主要理解Map集合里比较常用的两个集合HashMap和TreeMap集合。
HashMap集合是通过哈希值来存储的,而TreeMap集合是对象的比较性或者是传入的比较器来排序存储的。对象不具备比较性,如果没有传入比较器,TreeMap就没办法排序,所以Person类要实现Comparable接口。

为什么结构的键不排序呢,实现接口 Comparable<Person>不就是为了让Person自身具有比较性吗,hashCode()和equals()方法是为了不能有重复的值,那为什么结果键不具有排序呢。
对于楼主这个问题是因为你在创建集合的时候创建的是HashMap集合的对象,而不是TreeMap集合,所以才不会排序。

为什么要实现接口 Comparable是因为,我们有可能会创建的是TreeMap集合,也有可能创建HashMap集合,既然有多种可能,那么毕老师在视频上也说过,我们在创建一个类时就就要考虑多种情况。
作者: 下雨天    时间: 2013-7-18 22:56
恩  楼上说的对   你实现了Comparable的作用是让Person类自身具备比较性   但是你没有用到Tree系列的集合   所以这个比较器也就没产生作用
作者: 杨增坤    时间: 2013-7-18 22:57
陈雪琪 发表于 2013-7-18 22:35
我觉得楼主要理解Map集合里比较常用的两个集合HashMap和TreeMap集合。
HashMap集合是通过哈希值来存储的, ...

谢谢,我懂了!
作者: 杨增坤    时间: 2013-7-18 22:58
谢谢大家的回复,我明白了,!
作者: 杨增坤    时间: 2013-7-18 23:00
下雨天 发表于 2013-7-18 22:56
恩  楼上说的对   你实现了Comparable的作用是让Person类自身具备比较性   但是你没有用到Tree系列的集合   ...

嗯,懂了,就是预防呗!
作者: 下雨天    时间: 2013-7-18 23:04
对的 对的
作者: 杨增坤    时间: 2013-7-18 23:44
巩建 发表于 2013-7-18 21:26
HashMap   底层是哈希表数据结构,你觉得用排序么

嗯,懂了!




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