标题: 程序报错求解 [打印本页] 作者: 赵国刚 时间: 2013-8-11 12:19 标题: 程序报错求解 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>(作者: 龚首道 时间: 2013-8-11 16:08
TreeMap<Character,Integer>()中传入自定义比较器,需要写TreeMap的构造方法:
一、TreeMap()
使用键的自然顺序构造一个新的、空的树映射。
二、TreeMap(Comparator<? super K> comparator)
构造一个新的、空的树映射,该映射根据给定比较器进行排序。
三、TreeMap(Map<? extends K,? extends V> m)
构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。作者: 施大勇 时间: 2013-8-13 18:51
首先,第一点:对于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指定一个你想要的比较器。