【问题标题】:Why can't I copy/convert a List<Set<String>> into a SortedMap<Set<String>,Integer>?为什么我不能将 List<Set<String>> 复制/转换为 SortedMap<Set<String>,Integer>?
【发布时间】:2012-11-28 13:04:03
【问题描述】:

我想将我的元素从List&lt;Set&lt;String&gt;&gt; 复制到SortedMap&lt;Set&lt;String&gt;,Integer&gt;, 但我总是得到:

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); 
}

【问题讨论】:

  • 请添加您拥有的代码,否则我们无法真正帮助您...
  • List> > tempnewOut= new ArrayList(); SortedMap,Integer> freqSetsWithCount= new TreeMap(); for (Set set : tempnewOut) { freqSetsWithCount.put(set, 0); }
  • @GaborToth 说真的……你能看一下你发表的评论吗?请编辑您的问题并在此处添加您的代码。

标签: java list map


【解决方案1】:

您在TreeMap(接口SortedMap 的实现之一)中用作键的类必须实现接口Comparable,或者您必须通过提供Comparator 来创建TreeMap构造函数。

您正在尝试使用 HashSet&lt;String&gt; 作为密钥。 HashSet 没有实现 Comparable,而且你没有提供 Comparator,所以你得到了 ClassCastException

一种解决方案是通过将Comparator 传递给构造函数来创建TreeMap。您必须实现 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 中的键。这意味着您必须对如何对这些集合进行排序有所了解:如果您有两个集合,您如何确定哪个在排序顺序中排在首位?它是元素最少的集合,还是您有其他标准?由您决定。在不知道您想如何对集合进行排序的情况下,我无法回答您的问题。
【解决方案2】:

SortedMap,顾名思义,是一个排序元素的 Map。为了能够以这种方式对元素进行排序,必须在其中的元素上实现 Comparable 接口。

您正在使用的 Set 列表没有实现 Comparable 接口,因此您不能简单地将 List 中的 Set 放入 SortedMap 的 Set 中而不将它们转换为实现 Comparable 的东西恐怕……

【讨论】:

    【解决方案3】:

    我不是 100% 确定,但我认为 Set 接口不会扩展 Comparable 接口。但是为了在 sortedMap 中使用对象作为 Key,它需要实现 Comparable

    这是合乎逻辑的,如果您不知道一个实例是否大于、等于或小于另一个实例,则无法对任何内容进行排序...

    和其他人一样,如果有意义的话,我建议你使用 Integer 作为 Key。

    【讨论】:

      【解决方案4】:

      SortedMap 要求键(您的情况是哈希集)实现可比较的接口来对其进行排序。

      Hashset 没有实现它,所以它不能在 SortedMap 实现中进行类型转换。 您可以编写自己的 Set 扩展 hashmap 并实现可比的功能以使其工作。

      如果你想按整数排序,只需切换键和值

      SortedMap<Integer,Set<String>>
      

      javadoc 对我来说很清楚

      http://docs.oracle.com/javase/1.5.0/docs/api/java/util/SortedMap.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2018-10-31
        相关资源
        最近更新 更多