我正在开发一个简单的项目,它从输入文件中获取数据,获取所需内容并将其打印到文件中。我基本上得到字频,所以每个键都是一个字符串,值是文档中的频率。但问题是,我需要按频率的降序将这些值打印到文件中。在制作我的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
....
所以看起来删除功能不起作用,因为它保持获得相同的值。我认为我有一个范围规则的问题,或者我只是不太了解哈希映射。
如果有人知道更好的方法来对哈希图进行排序并打印出来,我欢迎提出建议。
感谢
答案 0 :(得分:2)
您的代码不起作用,因为在每次后续迭代中,entry.getValue() > valueMax
永远不会成立,因为您在重新进入while循环时不会重置valueMax
。
尽管如此,你不需要在可同时访问的地图上进行双循环。
ConcurrentSkipListMap
有一个lastKey
方法,它返回最大的键,不需要在整个地图上进行迭代。
答案 1 :(得分:1)
在您的代码中,您似乎没有在循环结束时重置valueMax
。这意味着第一次循环你会找到最大值,但你永远不会找到任何后续值,因为你仍然会比较总体最大值。
答案 2 :(得分:1)
Hashmap:没有订单。您可以使用ArrayList来实现List以获得订单。
看看:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
答案 3 :(得分:0)
我猜是因为地图中没有带有键&gt;的条目。 valueMax的初始值,因此条件if (entry.getValue() > valueMax)
永远不会为真。
此外,还有TreeMap
保存其内容的排序,因此您可以迭代它entrySet()
w / o任何其他逻辑。
答案 4 :(得分: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);