【问题标题】:Java map entry string casting issueJava映射条目字符串转换问题
【发布时间】:2018-03-10 18:47:14
【问题描述】:

我正在制作一个自定义刺激器以在 SortedMap 中使用,其中键是字符串,值是该字符串被读取次数的计数。 当我运行它时,我得到这个错误:

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map$Entry at comp2402a1.Part8$1.compare(Part8.java:21)

我似乎无法弄清楚为什么会出现此转换错误。任何人都可以提供的帮助和见解将不胜感激。

这是我的代码:

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
//Custom comparator
Comparator<Map.Entry<String, Integer>> mapCompare = new Comparator<Map.Entry<String, Integer>>(){ 
  @Override
  public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
    if (o1.getValue()-o2.getValue() != 0){
      return o1.getValue()-o2.getValue(); 
    } else {
      return o1.getKey().compareTo(o2.getKey()); 
    }
  }
};

//Read lines into a HashMap & count instance #s 
HashMap<String, Integer> hMap = new HashMap(); 
for (String line = r.readLine(); line != null; line = r.readLine()) {
  if (hMap.get(line)==null) {
    hMap.put(line,1); 
    w.println("1");
  } else {
    hMap.put(line, hMap.get(line)+1);
  }
}

//Put objects into sorted map w/custom sort and output
SortedMap<String, Integer> sMap = new TreeMap(mapCompare); 
sMap.putAll(hMap);
for (Map.Entry<String, Integer> e : sMap.entrySet()){
  w.println(e.getKey()); 
}

}

【问题讨论】:

  • 错误在哪一行?
  • 您不能用Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; 创建TreeMap&lt;String, Integer&gt;。它期待一个Comparator&lt;String&gt;。如果您没有使用原始类型,您可能会在 new TreeMap&lt;&gt;(mapCompare) 发现错误。
  • 您真的需要地图进行查找,还是只需要键/值对的有序序列?
  • @shmosel 我需要地图进行查找,错误出现在我的比较器声明第 3 行

标签: java string casting maps comparator


【解决方案1】:

出现错误是因为我创建了 Comparator&lt;Map.Entry&lt;String, Integer&gt;&gt; 类型的比较器,而不是 Comparator&lt;String&gt;

我通过首先在我的 HashMap 上创建调用 Map.entrySet() 来修复它,将它放入一个列表中,对其进行排序,然后基于我的 SortedMap。

【讨论】:

  • 我很好奇您是如何将地图从列表中剔除的。你能分享你的代码吗?
猜你喜欢
  • 2017-01-16
  • 2016-10-20
  • 2014-05-26
  • 1970-01-01
  • 2013-11-20
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多