[英]Why can't I copy/convert a List<Set<String>> into a SortedMap<Set<String>,Integer>?
我想将我的元素从List<Set<String>>
复制到SortedMap<Set<String>,Integer>
,但是我总是得到:
java.lang.ClassCastException: java.util.HashSet cannot be cast to java.lang.Comparable. (or HashMap could be a TreeSet too, vice versa)
我读过的一些地方说不可能,但这是正确的吗?
我不敢相信我无法将原始列表或集合复制到地图中。
这是我尝试过的:
List<Set<String> > tempnewOut= new ArrayList<>();
SortedMap<Set<String>,Integer> freqSetsWithCount= new TreeMap<>();
for (Set<String> set : tempnewOut)
{
freqSetsWithCount.put(set, 0);
}
在TreeMap
(接口SortedMap
一种实现)中用作键的类必须实现接口Comparable
,或者必须通过向构造函数提供Comparator
来创建TreeMap
。
您正在尝试使用HashSet<String>
作为键。 HashSet
没有实现Comparable
,并且没有提供Comparator
,因此得到ClassCastException
。
一种解决方案是创建TreeMap
通过传递一个Comparator
的构造。 您必须实现Comparator
的compare
方法,以指定应如何在地图中对集合进行排序。
List<Set<String>> list = new ArrayList<>();
Comparator<Set<String>> comparator = new Comparator<Set<String>>() {
@Override
public int compare(Set<String> o1, Set<String> o2) {
// TODO: Implement your logic to compare the sets
}
};
SortedMap<Set<String>, Integer> set = new TreeMap<>(comparator);
// TODO: Fill the set
顾名思义,SortedMap是已排序元素的Map。 为了能够以这种方式对元素进行排序,必须在其中的元素上实现Comparable接口。
您正在使用的Set列表没有实现Comparable接口,因此您不能简单地将List中的Set放在SortedMap的Set内,而不能将它们转换为实现Comparable的对象害怕...
我不确定100%,但是我认为Set
接口不会扩展Comparable
接口。 但是为了将对象用作sortedMap中的Key,它需要实现Comparable
。
这只是合乎逻辑的,如果您不知道一个实例是否大于,等于或小于另一个实例,则无法对任何内容进行排序...
像其他人一样,我建议您在有任何意义的情况下使用Integer作为Key。
SortedMap要求键(您的情况是哈希集)实现可比较的接口才能对其进行排序。
Hashset没有实现它,因此它不能在SortedMap实现中进行类型转换。 您可以编写自己的Set,该Set扩展了hashmap并实现了与之相当的方法以使其工作。
如果要按整数排序,只需切换键和值
SortedMap<Integer,Set<String>>
javadoc对我来说很清楚
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.