繁体   English   中英

为什么我不能复制/转换列表 <Set<String> &gt;进入SortedMap <Set<String> ,整数&gt;?

[英]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的构造。 您必须实现Comparatorcompare方法,以指定应如何在地图中对集合进行排序。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM