所以我是Java的新手,因此我正在通过练习,将我的一个Python程序转换为Java.
我遇到了一个问题,我试图复制行为,从python下面将只返回排序的键(按值),而不是值:
popular_numbers = sorted(number_dict, key = number_dict.get, reverse = True)
Run Code Online (Sandbox Code Playgroud)
在Java中,我做了一些研究,还没有找到一个简单的样本用于n00b,例如我自己或类似的方法.我找到了使用Guava进行排序的示例,但排序似乎返回按键排序的HashMap.
除了上述之外,我在Java中没有找到的关于Python的其他好处之一是能够轻松返回已排序值的子集.在Python中,我可以简单地执行以下操作:
print "Top 10 Numbers: %s" % popular_numbers[:10]
Run Code Online (Sandbox Code Playgroud)
在此示例中,number_dict是键值对的字典,其中键表示数字1..100,值是数字(键)出现的次数:
for n in numbers:
if not n == '':
number_dict[n] += 1
Run Code Online (Sandbox Code Playgroud)
最终结果将是这样的:
十大数字:['27','11','5','8','16','25','1','24','32','20']
为了澄清,在Java中我成功创建了一个HashMap,我已经成功检查了数字并增加了键值对的值.我现在陷入了排序并根据值返回前10个数字(键).
ars*_*jii 10
entrySet()
放入List
.Collections.sort
和根据其值对s Comparator
进行排序Entry
.subList(int, int)
方法List
检索包含前10个元素的新列表.是的,它会比Python更冗长:)
假设您的地图定义如下,并且您想根据值进行排序:
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);
Run Code Online (Sandbox Code Playgroud)
现在,打印列表的前 10 个元素。
for (int i=0; i<10; i++) {
System.out.println(list.get(i));
}
Run Code Online (Sandbox Code Playgroud)
Map 中的值实际上并未排序,因为HashMap
根本没有排序(它根据键的 hashCode 将值存储在桶中)。此代码仅显示地图中 10 个最小的元素。
编辑排序而不丢失键值对:
//sorted tree map
TreeMap<Integer, Integer> tree= new TreeMap<>();
//iterate over a map
Iteartor<Integer> it= map.keySet().iterator();
while (it.hasNext()) {
Integer key= it.next();
tree.put(map.get(key), key);
}
Run Code Online (Sandbox Code Playgroud)
现在您拥有了TreeMap
已排序的树,并且具有与原始映射相反的键值对,因此您不会丢失信息。
归档时间: |
|
查看次数: |
12383 次 |
最近记录: |