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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. TreeMap<Person, String> tm = new TreeMap<>(new Comparator<Person>() {
  2.                         @Override
  3.                         public int compare(Person o1, Person o2) {
  4.                                 int num = o1.getAge()- o2.getAge();
  5.                                 int sge = o2.getName().compareTo(o1.getName());
  6.                                 return sge = num == 0 ? 1 : num;
  7.                         }
  8.                 });
  9.                 tm.put(new Person("zhangsan",23),"就业班");
  10.                 tm.put(new Person("lisi",24), "基础班");
  11.                 tm.put(new Person("wangwu",23), "就业班");
  12.                 tm.put(new Person("zhaoliu",25), "就业班");
  13.                 tm.put(new Person("zhouqi",26), "基础班");
  14.                 tm.put(new Person("qianba",25), "就业班");
  15.                 tm.put(new Person("qianba",25), "就业班");
  16.                 System.out.println(tm);
  17.                
  18.                 for (Person p : tm.keySet()) {
  19.                         System.out.println(p+ "---"+ tm.get(p));
  20.                 }
复制代码


14 个回复

正序浏览
本帖最后由 ylca 于 2016-7-9 17:20 编辑
星空@3 发表于 2016-7-9 09:13
你看看我的比较器会返回null么?

兄弟别冲动!  我说的不是比较器返回null! 淡定!! 哈哈 我建议下断点 然后走一遍流程就知道咋回事了!
回复 使用道具 举报
ylca 发表于 2016-7-8 22:58
compare  不就是在比较器你重写的方法  有什么区别吗

你看看我的比较器会返回null么?
回复 使用道具 举报
星空@3 发表于 2016-7-8 18:49
这个应该是先调用我自定义的比较器吧?

compare  不就是在比较器你重写的方法  有什么区别吗
回复 使用道具 举报
ylca 发表于 2016-7-7 22:05
如果是这么写比较的话 在get的时候是会调用 compare 然后就返回null了

这个应该是先调用我自定义的比较器吧?
回复 使用道具 举报
星空@3 发表于 2016-7-7 13:06
我的原意是保留TreeMap中的重复元素,   我修改一一下比较器,  你看看能不能看懂!

如果是这么写比较的话 在get的时候是会调用 compare 然后就返回null了
回复 使用道具 举报
ylca 发表于 2016-7-6 04:17
刚详细看了下原来是比较器写错了  

return sge = num == 0 ? 1 : num;  这个我是真没看懂

我的原意是保留TreeMap中的重复元素,   我修改一一下比较器,  你看看能不能看懂!
  1. TreeMap<Person, String> tm = new TreeMap<>(new Comparator<Person>() {
  2.                         @Override
  3.                         public int compare(Person o1, Person o2) {
  4.                                 int num = o1.getAge() - o2.getAge();
  5.                                 num = num == 0 ?  o2.getName().compareTo(o1.getName()) : num;
  6.                                 num = num == 0 ? 1 : num;

  7.                                 return num;               
  8.                         }                                       
  9.                 });
复制代码


回复 使用道具 举报
ylca 中级黑马 2016-7-6 04:17:27
9#
刚详细看了下原来是比较器写错了  

return sge = num == 0 ? 1 : num;  这个我是真没看懂

我这么写是可以的
TreeMap<Person, String> tm = new TreeMap<>(new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                    int num = p1.getAge()-p2.getAge();
                                return num ==0 ?p1.getName().compareTo(p2.getName()):num ;
            }
    });
    tm.put(new Person("zhangsan",23),"就业班");
    tm.put(new Person("lisi",24), "基础班");
    tm.put(new Person("wangwu",23), "就业班");
    tm.put(new Person("zhaoliu",25), "就业班");
    tm.put(new Person("zhouqi",26), "基础班");
    tm.put(new Person("qianba",25), "就业班");
    tm.put(new Person("qianba",25), "就业班");
    System.out.println(tm);
   
    for (Person p : tm.keySet()) {
            System.out.println(p+ "---"+ tm.get(p));
    }
控制台输出
{Person [name=wangwu, age=23]=就业班, Person [name=zhangsan, age=23]=就业班, Person [name=lisi, age=24]=基础班, Person [name=qianba, age=25]=就业班, Person [name=zhaoliu, age=25]=就业班, Person [name=zhouqi, age=26]=基础班}
Person [name=wangwu, age=23]---就业班
Person [name=zhangsan, age=23]---就业班
Person [name=lisi, age=24]---基础班
Person [name=qianba, age=25]---就业班
Person [name=zhaoliu, age=25]---就业班
Person [name=zhouqi, age=26]---基础班

回复 使用道具 举报
ylca 中级黑马 2016-7-6 03:57:40
8#
元笙 发表于 2016-7-4 22:26
经过我测试,发现如下几点问题:
1,你的tm.put(xxx)方法的返回值均为null,这是正常的,因为你的比较器是允许重 ...

就算是重写equals 也是无效的    使用Entry是可以的
for (Entry<Person, String> en : tm.entrySet()) {
            System.out.println(en.getKey()+ "---"+ en.getValue());
    }
回复 使用道具 举报
元笙 发表于 2016-7-4 22:26
经过我测试,发现如下几点问题:
1,你的tm.put(xxx)方法的返回值均为null,这是正常的,因为你的比较器是允许重 ...

哥们儿,我重写了equals方法也没有得到想要的结果,你说的API中的说明我也看了,说实话, 没怎么看懂! 问了老师,他说TreeMap那样保留重复自定义对象,就是get 不到值, 他没不知道为什么!{:3_50:}
回复 使用道具 举报
附上Person类的代码:
  1. package com.heima.lianxi;

  2. public class Person implements Comparable<Person>{
  3.         private String name ;
  4.         private int age;
  5.         public Person() {
  6.                 super();
  7.                
  8.         }
  9.         public Person(String name, int age) {
  10.                 super();
  11.                 this.name = name;
  12.                 this.age = age;
  13.         }
  14.         public String getName() {
  15.                 return name;
  16.         }
  17.         public void setName(String name) {
  18.                 this.name = name;
  19.         }
  20.         public int getAge() {
  21.                 return age;
  22.         }
  23.         public void setAge(int age) {
  24.                 this.age = age;
  25.         }
  26.         @Override
  27.         public String toString() {
  28.                 return "Person [name=" + name + ", age=" + age + "]";
  29.         }
  30.         @Override
  31.         public int compareTo(Person o) {
  32.                 int num = this.age-o.age;
  33.                 int sage = this.name.compareTo(o.name);
  34.                 return  sage = num == 0 ? 1:num;       
  35.         }
  36.         @Override
  37.         public int hashCode() {
  38.                 final int prime = 31;
  39.                 int result = 1;
  40.                 result = prime * result + age;
  41.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  42.                 return result;
  43.         }
  44.         @Override
  45.         public boolean equals(Object obj) {
  46.                 if (this == obj)
  47.                         return true;
  48.                 if (obj == null)
  49.                         return false;
  50.                 if (getClass() != obj.getClass())
  51.                         return false;
  52.                 Person other = (Person) obj;
  53.                 if (age != other.age)
  54.                         return false;
  55.                 if (name == null) {
  56.                         if (other.name != null)
  57.                                 return false;
  58.                 } else if (!name.equals(other.name))
  59.                         return false;
  60.                 return true;
  61.         }
  62.        
  63.        
  64.        
  65. }
复制代码


回复 使用道具 举报
本帖最后由 元笙 于 2016-7-4 22:28 编辑

经过我测试,发现如下几点问题:
1,你的tm.put(xxx)方法的返回值均为null,这是正常的,因为你的比较器是允许重复,这一点保证了put方法的返回值一定是null(注意,这是先前值,而不是没有映射关系返回的null),你仔细查看API,便能发现
2,System.out.println(tm),隐含调用tm.toString方法,查看API是调用父类AbstractMap的toString方法,底层使用entrySet()遍历,因此能分别获取键getKey()和值getValue()
3,增强for循环中的tm.get(xxx)方法经查看API,是继承了Map接口的get()方法,该方法满足 (key==null ? k==null : key.equals(k)) 才会返回value的值,否则返回null,你的key是Person类类型,因此如果没有重写equals()方法,会默认继承Object类的equals()方法,比较的是2个对象的地址,因此equals()方法一定是返回false,因此才导致get()方法返回null,你就拿不到value值
我把增强for改成使用entrySet()遍历,即可,你试试
回复 使用道具 举报
比较器,有问题
回复 使用道具 举报
元笙 发表于 2016-7-2 16:49
KeySet是Key集也就是String数据集合,就是zhangsan,,lisi,,wangwu...的元素集合,因此你要把增强for循环里面P ...

那tm的key不就是person类型的吗?
回复 使用道具 举报
KeySet是Key集也就是String数据集合,就是zhangsan,,lisi,,wangwu...的元素集合,因此你要把增强for循环里面Person p改成String s
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马