Java How to return top 10 items based on value in a HashMap
所以我对Java非常陌生,因此我正在通过一个练习来战斗,把我的Python程序转换成Java。
我遇到了一个问题,我正试图从python复制行为,下面只返回按值排序的键,而不返回值:
1 | popular_numbers = sorted(number_dict, key = number_dict.get, reverse = True) |
在爪哇,我已经做了一点研究,还没有找到一个足够简单的样本作为NNB,比如我自己或者一个类似的方法。我找到了使用guava进行排序的示例,但排序似乎返回了按键排序的哈希图。
除上述之外,关于Python的其他好东西之一,我在Java中没有发现的是,能够轻松地返回排序值的子集。在python中,我可以简单地执行以下操作:
1 | print"Top 10 Numbers: %s" % popular_numbers[:10] |
号
在本例中,number_dict是键、值对的字典,其中key表示数字1..100,value是数字(key)出现的次数:
1 2 3 | for n in numbers: if not n == '': number_dict[n] += 1 |
最终结果是:
Top 10 Numbers: ['27', '11', '5', '8', '16', '25', '1', '24', '32',
'20']
号
为了澄清,在Java中,我已经成功创建了一个哈希表,我成功地检查了数字并增加了键、值对的值。我现在只能继续排序,并根据值返回前10个数字(键)。
是的,它将比python详细得多。)
用JAVA 8 +,获取中间列表的前10个元素:
1 | list.stream().sorted().limit(10).collect(Collectors.toList()); |
。
要获取映射键的前10个整数元素:
1 | map.keySet().stream().sorted().limit(10).collect(Collectors.toMap(Function.identity(), map::get)); |
。
使用
埃多克斯1〔13〕
只要您的比较器编写正确,您就可以迭代第一个
guava multiset非常适合您的用例,可以很好地替换您的hashmap。它是一个计算每个元素出现次数的集合。
multisets有一个方法copyHighestCountFirst,它返回按count排序的不可变multiset。
现在一些代码:
1 2 3 4 | Multiset<Integer> counter = HashMultiset.create(); //add Integers ImmutableMultiset<Integer> sortedCount = Multisets.copyHighestCountFirst(counter); //iterate through sortedCount as needed |
尝试下一个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public static void main(String[] args) { // Map for store the numbers Map<Integer, Integer> map = new HashMap<Integer, Integer>(); // Populate the map ... // Sort by the more popular number Set<Entry<Integer, Integer>> set = map.entrySet(); List<Entry<Integer, Integer>> list = new ArrayList<>(set); Collections.sort(list, new Comparator<Entry<Integer, Integer>>() { @Override public int compare(Entry<Integer, Integer> a, Entry<Integer, Integer> b) { return b.getValue() - a.getValue(); } }); // Output the top 10 numbers for (int i = 0; i < 10 && i < list.size(); i++) { System.out.println(list.get(i)); } } |
。
EDCOX1的0个s在Java中是不排序的,因此没有一个好的方法来命令他们通过所有的键来进行蛮力搜索。尝试使用
假设您的映射是这样定义的,并且您希望基于值进行排序:
1 2 3 4 5 | HashMap<Integer, Integer> map= new HashMap<Integer, Integer>(); //add values Collection<Integer> values= map.values(); ArrayList<Integer> list= new ArrayList<Integer>(values); Collections.sort(list); |
现在,打印列表的前10个元素。
1 2 3 |
号
映射中的值实际上没有排序,因为
编辑排序而不丢失键值对:
1 2 3 4 5 6 7 8 9 |
现在,您有了已排序的