繁体   English   中英

为什么remove函数不适用于hashmaps?

[英]Why is the remove function not working for hashmaps?

我正在开发一个简单的项目,从输入文件中获取数据,获取所需内容并将其打印到文件中。 我基本上得到字频,所以每个键都是一个字符串,值是文档中的频率。 但问题是,我需要按频率的降序将这些值打印到文件中。 在制作我的hashmap之后,这是我的程序的一部分,它对它进行排序并将其写入文件。

//Hashmap I create
Map<String, Integer> map = new ConcurrentHashMap<String, Integer>();
int valueMax = -1;
//function to sort hashmap
while (map.isEmpty() == false){
            for (Entry<String, Integer> entry: map.entrySet()){
                if (entry.getValue() > valueMax){
                    max = entry.getKey();
                    System.out.println("max: " + max);
                    valueMax = entry.getValue();
                    System.out.println("value: " + valueMax);
                }
            }
            map.remove(max);
            out.write(max + "\t" + valueMax + "\n");
            System.out.println(max + "\t" + valueMax);  
        }   

当我跑这个我得到:

t 9
t 9
t 9
t 9
t 9
....

所以看起来删除功能不起作用,因为它保持获得相同的值。 我想我有一个范围规则的问题,或者我只是不太了解hashmaps。

如果有人知道更好的方法来排序哈希映射并打印它,我会欢迎一个建议。

谢谢

您的代码不起作用,因为在每次后续迭代中, entry.getValue() > valueMax永远不会为真,因为您在重新进入while循环时不重置valueMax

尽管如此,您不需要在可同时访问的地图上进行双循环。

ConcurrentSkipListMap有一个lastKey方法,它返回最大的键,不需要在整个映射上进行迭代。

从您的代码看,您似乎没有在循环结束时重置valueMax 这意味着第一次循环你会找到最大值,但你永远不会找到任何后续值,因为你仍然会比较总体最大值。

Hashmap:没有订单。 您可以使用ArrayList来实现List以获得订单。

看看: http//docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

我想这是因为map中没有条目带有key> valueMax的初始值,所以条件if (entry.getValue() > valueMax)永远不为真。

另外,还有TreeMap对其内容进行了排序,因此您可以在任何其他逻辑上迭代它的entrySet()

怎么样(没有经过测试)

  final Map<String, Integer> map = new ConcurrentHashMap<String, Integer>();
  final Comparator <String, String> comparator = new Comparator ()
         {
             compare(String o1, String o2) 
             {
                  return map.get(o1) - map.get(o2);
             }
         };

  final TreeMap <String, Integer> sortedMap = new TreeMap (comparator);
  sortedMap.addAll(map);
  System.out.println(sortedMap);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM