java - 使用 map 树进行 map 条目转换

标签 java dictionary treemap

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

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

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

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

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

}

最佳答案

Now I wish to make a "top ten" list that contains the most used words. I wanted to "flip" my treemap so that the integer values would be what would be put in order and the string would follow

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

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

其次,在您的代码中:-

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

使用上面的 if 语句,您将 ArrayListInteger 值进行比较。 temp 包含key,它们是整数entry 中的值是 ArrayList。因此,这将在运行时失败。此外,由于您的原始 map 仅包含在文本文件中找到的单词的位置。因此,您需要做的就是获取每个单词的 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));    
    }
}

所以,您可以看到,我只是使用了条目集中大小。并将其作为 key 放入 TreeMap 中。另外,使用 new Integer(size) 也非常重要。它确保每个整数引用都指向一个新对象。因此没有重复。

另请注意,您的 TreeMap 按升序对 Integer 值进行排序。您最常使用的单词将出现在末尾的某个位置。

关于java - 使用 map 树进行 map 条目转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356097/

相关文章:

python - 使用键列表遍历多维字典的优雅方式?

java - Struts2:更新 Map 中 "List Of Objects"的值

Java:查找父级和子级......Tree,Loop,ArrayList,List,HashMap,......做什么?

java - 为什么包含值返回 false?

java - Scala 生成的字节码到 Java 代码的转换

java - 使用一种方法进行快速排序

python - 字典理解中的字典合并

Julia 中的字典帮助 - 从文本文件创建字典

java - 黑名单 Maven 依赖项

java - 如何从 Java 程序返回一些值给 shell?