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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

public static void main(String[] args) {

                TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>(){
                        public int compare(Student s1,Student s2){
                                int num = s1.getAge() - s2.getAge();
                                return num == 0 ? 1 :num;
                        }
                });
               
                tm.put(new Student("王五",25), "上海");
                tm.put(new Student("张三",23), "北京");
                tm.put(new Student("李四",24), "深圳");
                System.out.println(tm);
               
                for(Student s : tm.keySet()) {
                        System.out.println(s + " ..." + tm.get(s));
                }
        }





输出:Student [name=张三, age=23] ...null
          Student [name=李四, age=24] ...null
          Student [name=王五, age=25] ...null

6 个回复

倒序浏览
本帖最后由 Clouddd 于 2016-3-9 16:52 编辑

return num == 0 ? 1 :num;
你这里的接口的返回值写错了。应该是 return num == 0 ? 0 :num;
因为当你两个年龄相等的时候应该返回0,这样的判断就代表要存入的学生的年龄和key已有的学生的年龄相等,那样子的话这个学生就不会存入到Map中。可是由于你写等于0的时候返回1,那么就会存入到MAP中了。---
再后来用get(object o)方法拿的时候,JVM会把o对象的年龄属性去和MAP中每个KEY去比较,比较的方法就是你写的接口方法,只有当相减为0的时候(这个查找的条件是年龄,相减为0代表要查找的学生的年龄和key中某个学生的年龄相等),才会返回这个KEY对应的VALUE。
回复 使用道具 举报
首先谢谢你的回答,其次说下我的感受:我本来想实现的是key里面的学生同年龄不同名的,也要存进去并打印出来的。按你的把返回值改为0,就只要年龄相同就不会存进来了。    还有个我不太理解的是你说的最后一句话,为什么只有相减为0,才返回这个key对应的value呀?烦请解释下,谢谢哈!
回复 使用道具 举报
Clouddd 发表于 2016-3-9 16:47
return num == 0 ? 1 :num;
你这里的接口的返回值写错了。应该是 return num == 0 ? 0 :num;
因为当你两个 ...

首先谢谢你的回答,其次说下我的感受:我本来想实现的是key里面的学生同年龄不同名的,也要存进去并打印出来的。按你的把返回值改为0,就只要年龄相同就不会存进来了。    还有个我不太理解的是你说的最后一句话,为什么只有相减为0,才返回这个key对应的value呀?烦请解释下,谢谢哈!
回复 使用道具 举报
小赵VS老付 发表于 2016-3-9 18:02
首先谢谢你的回答,其次说下我的感受:我本来想实现的是key里面的学生同年龄不同名的,也要存进去并打印 ...

1.首先如果你想判断的是同年龄不同名,那么你的接口方法已经错了,判断条件应该是用名字来判断;
2.对于TreeMap我不知道你理解多少,按照一般是视频上来说,TreeMap底层的数据结构是红黑二叉树,要实现Comparable接口重新方法来保证存入的数据进行排序和保证唯一性。
然后,在刚刚的你写的接口方法中,你是通过年龄来判断存入的数据是不是一样的。
例如:Student s1 = new("Tom", 20);
         Student s2 = new("Sue", 20);
按照正常的方法来说,根据年龄来作为判断条件,为了保证存进去的数据不能重复,那么年龄相同的就不能存进去了,所以s1和s2只能存进去一个。
那么在get(Object o)的时候,TreeMap是怎么通过你输进去的Object对象去找到相应的Value呢?
它还是通过你之前写的接口方法,通过你输入的Object对象的年龄和已经存入到TreeMap中的所有Key值的年龄进行比较,如果两者相减为0,就说明了你输入进去的Object对象在TreeMap中已经找到了,所以便会返回该Key对应的Value。为了验证这个get是不是像我所说这般,你可以随便New一个对象,然后setAge()就可以了,随便set一个和Key中对象的年龄一样的就行。
回复 使用道具 举报
Clouddd 发表于 2016-3-10 09:59
1.首先如果你想判断的是同年龄不同名,那么你的接口方法已经错了,判断条件应该是用名字来判断;
2.对于T ...

哦哦,知道了,非常谢谢您!
回复 使用道具 举报
就是我 来自手机 中级黑马 2016-3-10 16:43:31
7#
我实验了一下,其他什么都不变,就是讲compare方法返回值直接使用num就ok了,也不知道为什么
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马