我想将我的元素从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);
}
答案 0 :(得分:2)
用作TreeMap
中的键(接口SortedMap
的一个实现)的类必须实现接口Comparable
,或者必须创建TreeMap
通过向构造函数提供Comparator
。
您正在尝试使用HashSet<String>
作为密钥。 HashSet
未实现Comparable
,并且您未提供Comparator
,因此您获得了ClassCastException
。
一种解决方案是通过将TreeMap
传递给构造函数来创建Comparator
。您必须实现compare
的{{1}}方法,以指定如何在地图中对集合进行排序。
Comparator
答案 1 :(得分:1)
如名称所示,SortedMap是已排序元素的Map。为了能够以这种方式对元素进行排序,必须在其中的元素上实现Comparable接口。
您正在使用的集合列表未实现Comparable接口,因此您无法简单地将List中的Set放入SortedMap的Set中,而无需将它们转换为实现Comparable的内容我害怕......
答案 2 :(得分:0)
我不是百分百肯定,但我认为Set
接口不会扩展Comparable
接口。但是为了在一个sortedMap中使用一个对象作为Key,它需要实现Comparable
。
这是合乎逻辑的,如果你不知道一个实例是否大于,等于或小于另一个实例,你就无法对任何事物进行排序......
与其他人一样,我建议你使用Integer作为Key,如果这有意义的话。
答案 3 :(得分:0)
SortedMap要求密钥(您的情况是hashset)实现可比较的接口以对其进行排序。
Hashset没有实现它,所以它无法在SortedMap实现中进行类型转换。 你可以编写自己的Set,它扩展了hashmap,并且实现了类似的功能。
如果要按整数对其进行排序,只需切换键和值
即可SortedMap<Integer,Set<String>>
javadoc对我来说非常清楚
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html