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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵国刚 中级黑马   /  2013-8-11 12:19  /  1158 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(
         new Comparator<Map.Entry<Character,Integer>>(){  
            
              public int compare(Map.Entry<Character,Integer> me1, Map.Entry<Character,Integer> me2){
                  int mun = me1.getValue().compareTo(me2.getValue());
                  if(mun==0)
                     return me1.getKey().compareTo(me2.getKey());
                  return mun;
              }
        });
new TreeMap然后以匿名内部类的形式传了一个比较器进去,编译报错:
找不到符号
符号: 构造函数 TreeMap(<匿名 java.util.Comparator<java.util.Map.Entry<java.lang.Character,java.lang.Integer>>>)
位置: 类 java.util.TreeMap<java.lang.Character,java.lang.Integer>
       TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(

2 个回复

正序浏览
首先,第一点:对于Map集合来说,集合中的Key是不许重复的,而它的Value值是可以重复的。那么对于HashMap来说,如果采用自定义的类的对象作为集合中的Key,则需要自定义的类中重写HashCode()和equals()方法来保证Key的唯一性。 而对于TreeMap集合来说,保证Key的唯一性是通过自定义类中的
public int compareTo()来实现的。而如果自定义类中没排序或排序不是想要的,则可以重定义一个专门排序的类来保证TreeMap集合中的Key的唯一性。

楼主在上题中是想采用匿名类的形式来保证TreeMap集合中的Key不重复并保证一定的排序,
              public int compare(Map.Entry<Character,Integer> me1, Map.Entry<Character,Integer> me2){
                  int mun = me1.getValue().compareTo(me2.getValue());
                  if(mun==0)
                     return me1.getKey().compareTo(me2.getKey());
                  return mun;
              }
而在实际操作中却先比较的是Value,若Value值相等时才去比较Key的值,这样分析的话TreeMap集合就不是按照其定义中所说的那样按照Key来排序并实现唯 一的,如果先认为楼主的代码是正确的,那么这个集合在排序时优先考虑的是其元素的Value值是否相同,如果value值不相同,则就将其作为一个元素加到了集合中,如此多加几次,那么这个集合中就会出现这样一种情况,同一个Key对应着几个不同的value值,这与我们所学的TreeMap集合中key存在互斥性就矛盾了,由此可以明白楼主的问题出在哪了。
对于楼主题中的集合来说,其Key是一个字符集,默认采用的是字母在字典中的自然排序,如果这不是你想要的排序,可以对Key指定一个你想要的比较器。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
TreeMap<Character,Integer>()中传入自定义比较器,需要写TreeMap的构造方法:
一、TreeMap()
      使用键的自然顺序构造一个新的、空的树映射。
二、TreeMap(Comparator<? super K> comparator)
      构造一个新的、空的树映射,该映射根据给定比较器进行排序。
三、TreeMap(Map<? extends K,? extends V> m)
      构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

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