如何在Java中获取HashMap的前10个键值对

3

i have hashmap like this:

{apple, 20}, {nanas,18}, {anggur, 12},...........

我的HashMap已经按值降序排序了。 我想从第一个元素的HashMap中获取10个元素。 有人能帮忙吗?

只需在条目集上使用一个简单的循环吗? - Tom Cools
1
我的哈希映射已经按值降序排序了。哈希映射不保留任何顺序。如果您能够对其进行排序,那么您可能是使用其他结构(如列表)来完成的。在这种情况下,为什么不直接迭代这个列表中的前10个元素呢?如果不是这种情况,请澄清一下。 - Pshemo
HashMap 无法排序,因为它没有顺序。因此不存在“第一个” 10 或“最后一个” 10。这个问题毫无意义。 - Boris the Spider
1
很确定HashMap是无序的。它们没有“前10个元素”。 - Carcigenicate
4个回答

4
如果您正在使用Java 8,我建议使用以下代码:
List<MyKeyType> keys = map.entrySet().stream()
  .map(Map.Entry::getKey)
  .sorted()
  .limit(10)
  .collect(Collectors.toList());

它的工作原理:

  1. entrySet().stream() - 获取Map的entry集合,并将其值作为流。
  2. map() - 获取Map.Entry中的键值并向下传递流
  3. sorted() - 如果类实现了Comparator接口,则默认使用它,或者您可以根据需要提供自己的实现。
  4. limit(10) - 限制对象数量为10个。
  5. 将排序后的10个值收集到列表中。

sorted()方法有一个可选的Comparator参数,您可以在其中提供自定义排序逻辑(如果需要)。


我也是。 :-) - Ole V.V.
由于该映射已经被排序,因此可以简化为更简洁的形式 - List<String> keys = sortedMap.keySet().stream() .limit(10) .collect(Collectors.toList()); - testphreak

2

既然你的地图已经排序,我们可以像这样获取前10个键值对作为一个新的地图:

Map<String, Integer> res = map.entrySet().stream()
        .limit(10)
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

如果您的地图未排序,我们可以采用以下方式:

Map<String, Integer> res = map.entrySet().stream()
        .sorted((o1, o2) -> o2.getValue() - o1.getValue())
        .limit(10)
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

0
将地图的entrySet()取出到列表中,按getValue()排序并取出最大值的10个条目。

0

您需要使用LinkedHashMap以保留元素的顺序(即插入顺序),您可以参考下面的代码从已加载的映射对象中检索前10个元素:

Map<String, Integer> map = new LinkedHashMap<>();
//Load your values here
Set<String> keys = map.keySet();
String[] keysArray = keys.toArray(new String[keys.size()]);
for(int i=0; i<keysArray.length && i<10;i++) {
    System.out.println(map.get(keysArray[i]));
}

LinkedHashMap 保持插入顺序或可选访问顺序 - 不按值的降序排列。 - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接