为什么我不能复制/转换List <set <string>&gt;到SortedMap <set <string>,Integer&gt;?</set <string> </set <string>

时间:2012-11-28 13:04:04

标签: java list map

我想将我的元素从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); 
}

4 个答案:

答案 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