使用地图树进行地图条目转换

时间:2012-11-13 05:43:39

标签: java dictionary treemap

所以我一直在尝试使用我之前拥有的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++;
     }

}

1 个答案:

答案 0 :(得分:1)

  

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

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

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

其次,在您的代码中: -

Integer object

使用上面的if语句,您要将if (temp.containsKey(entry.getValue())) ArrayList值进行比较。 Integer包含temp keyintegers中的值为entry。所以,那将在运行时失败。此外,由于您的ArrayList地图仅包含orginal中找到的word的位置。因此,您需要做的就是为每个单词获取text file的大小,并将其作为密钥。

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

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)); } } size的{​​{1}}。并将其作为values放在entry set中。使用key非常重要。它确保每个整数引用都指向一个新对象。因此没有重复。

另请注意,您的TreeMap按升序排序new Integer(size)值。你最常说的话就是最后的某个地方。