1

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

//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
....

所以看起来删除功能不起作用,因为它不断获得相同的值。我在想我的范围规则有问题,或者我只是不太了解哈希图。

如果有人知道对哈希图进行排序和打印的更好方法,我会欢迎提出建议。

谢谢

4

5 回答 5

2

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

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

ConcurrentSkipListMap有一个lastKey方法可以返回最大的键并且不需要在整个地图上进行迭代。

于 2012-10-24T23:25:07.313 回答
1

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

于 2012-10-24T23:27:31.617 回答
1

Hashmap:没有顺序。您可以使用 ArrayList,它实现了 List 以进行排序。

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

于 2012-10-24T23:37:55.610 回答
0

我猜这是因为地图中没有键> valueMax初始值的条目,所以条件if (entry.getValue() > valueMax)永远不会为真。

此外,还有TreeMap它的内容已排序,因此您可以在没有entrySet()任何其他逻辑的情况下对其进行迭代。

于 2012-10-24T23:27:41.193 回答
0

怎么样的东西(未测试)

  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);
于 2012-10-25T07:14:45.597 回答