【问题标题】:Map Entry conversion with Map Tree使用 Map Tree 进行 Map Entry 转换
【发布时间】:2012-11-13 05:43:38
【问题描述】:

所以我一直在尝试做的是使用我以前拥有的 TreeMap 并将其应用于此方法,在该方法中我将其转换为一个集合并让它通过 Map Entry Loop。我想做的是将我以前的 TreeMap 反转为相反的(翻转的)TreeMap

'当我运行我的代码时,它给了我一个类似的错误。这是否意味着我必须实施类似的方法?我将 arrayList 转换为 Integer,所以我认为类似的方法会支持它。还是我的代码有问题

错误:线程“main”中的异常 java.lang.ClassCastException:java.util.ArrayList 无法转换为 java.lang.Comparable

概述:最初,我对该程序的预期目的是制作一个从文本文档中读取并专门找到所有单词以及单词所在位置的索引/行的 Treemap。现在我想制作一个包含最常用词的“前十名”列表。我想“翻转”我的树形图,以便将整数值按顺序排列,然后字符串将跟随

public static void getTopTenWords(TreeMap<String, ArrayList<Integer>> map) {
    Set<Map.Entry<String, ArrayList<Integer>>> set = map.entrySet();
    TreeMap<Integer, String> temp = new TreeMap<Integer, String>();
    int count = 1;
    for(Map.Entry<String, ArrayList<Integer>> entry : set){
        if(temp.containsKey(entry.getValue())) {
            Integer val = entry.getValue().get(count);
            val++;
            temp.put(val, entry.getKey());
        }
        else {
            temp.put(entry.getValue().get(count), entry.getKey());
        }
        count++;
     }

}

【问题讨论】:

  • 你的key是String类型,你的value是ArrayList类型。你正在做temp.containsKey(entry.getValue()),它永远是false。您的临时地图声明说密钥应该是 Integer 类型。你的代码很混乱。您的陈述不够清楚,无法解释您到底想要达到什么目的。举例说明。
  • 我无法真正理解您方法的目的。你想翻转你的TreeMap,没问题。我不能阻止你这样做。但为了什么目的?你原来的TreeMap 包含什么,以及你想从新的TreeMap 中实现什么。如果可能,请举例说明清楚。
  • 抱歉,我提交时遗漏了一部分问题。不过我现在编辑了它
  • @James.. 您是否尝试创建 TreeMap&lt;List&lt;Integer&gt;, String&gt;?如果是,那么请注意,您不能将可变对象作为 Map 中的键。其次,TreeMap 中的键应该是Comparable。 --- 请告诉我们您的 : - TreeMap&lt;String, ArrayList&lt;Integer&gt;&gt; map 包含什么?

标签: java dictionary treemap


【解决方案1】:

现在我想制作一个包含最常用词的“前十名”列表。 我想“翻转”我的树形图,以便整数值是什么 将按顺序排列,字符串将跟随

请注意,Map 仅包含唯一键。因此,如果您尝试将 count 保留为密钥,则需要通过使用 new Integer(count) 创建一个新对象将其放入您的 Map

如果您将计数放入Map,例如:-map.put(2, "someword"),那么您之前的计数值可能会被覆盖,因为Integer 缓存了range: - [-128 to 127] 中的值。因此,如果您不创建新对象,这些范围之间的整数值将是 interned。因此,两个Integer 的值为2 将指向相同的Integer object,从而导致重复键。

其次,在您的代码中:-

if (temp.containsKey(entry.getValue()))

使用上面的 if 语句,您将 ArrayListInteger 值进行比较。 temp 包含 key,它们是 integersentry 中的值是 ArrayList。因此,这将在运行时失败。此外,由于您的orginal 地图仅包含在text file 中找到的word 的位置。因此,您需要做的就是为每个单词获取arraylist 的大小,并将其设为键。

您需要稍微修改一下代码。

public static void getTopTenWords(TreeMap<String, ArrayList<Integer>> map) {
    Set<Map.Entry<String, ArrayList<Integer>>> set = map.entrySet();

    TreeMap<Integer, String> temp = new TreeMap<Integer, String>();

    for(Map.Entry<String, ArrayList<Integer>> entry : set) {
        int size = entry.getValue().size();
        int word = entry.getKey();

        temp.put(new Integer(size), word));    
    }
}

所以,你可以看到,我只是在你的entry set 中使用了valuessize。并将其作为key 放在您的TreeMap 中。同样使用new Integer(size) 也很重要。它确保每个整数引用都指向一个新对象。因此没有重复。

另外,请注意,您的 TreeMap 按升序对您的 Integer 值进行排序。你最常用的词会在最后的某个地方。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
  • @James.. 不客气。请务必了解此答案中的基本内容,这非常重要。我建议,重新阅读答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多