如何从 HashMap 或 LinkedHashMap 获取有限数量的值?

问题描述 投票:0回答:7

假设我有一个包含 216 个条目的

LinkedHashMap
,我如何从
Object
获取前 100 个值(此处为
LinkedHashMap<Integer, Object>
类型)。

java hashmap linkedhashmap
7个回答
5
投票

首先,按照您的标题为

HashMap
执行此操作没有多大意义 -
HashMap
没有特定的顺序,并且顺序可能会在调用之间发生变化。不过,这对于
LinkedHashMap
来说更有意义。

在那里,我会使用Guava

Iterables.limit
方法:

Iterable<Object> first100Values = Iterables.limit(map.values(), 100);

// Or whatever type you're interested in...
Iterable<Map.Entry<Integer, Object>> firstEntries =
    Iterables.limit(map.entrySet(), 100);

然后您可以从中创建一个列表,或者迭代它,或者做任何您想做的事情。


3
投票

丑陋的单线

这个丑陋的单行就可以了(并在问题的情况下返回

ArrayList<Object>
):

Collections.list(Collections.enumeration(lhMap.values())).subList(0, 100)

这也适用于

HashMap
,但是
HashMap
HashSet
支持,不能保证您会获得输入的前 100 个值;它适用于其他类型,但具有类似的限制。

备注:

  • 效率相对较低(请阅读 Javadoc 以了解原因 - 尽管还有更糟糕的情况!),
  • 使用视图时要小心(阅读 Javadoc 了解更多),
  • 我确实提到过它很丑。

分步使用示例

(根据OP的评论)

Map<Integer, Pair<Double, SelectedRoad>> hashmap3 =
  new LinkedHashMap<Integer, Pair<Double, SelectedRoad>>();

// [...] add 216 elements to hasmap3 here somehow

ArrayList<Pair<Double,SelectedRoad>> firstPairs = 
  Collections.list(Collections.enumeration(hashmap3.values())).subList(0, 100)

// you can then view your Pairs' SelectedRow values with them with:
//  (assuming that:
//    - your Pair class comes from Apache Commons Lang 3.0
//    - your SelectedRoad class implements a decent toString() )
for (final Pair<Double, SelectedRoad> p : firstPairs) {
    System.out.println("double: " + p.left);
    System.out.println("road  : " + p.right);
}

3
投票

你可以这样做:

Map<Integer, Object> records;
List<Entry<Integer, Object>> firstHundredRecords
    = new ArrayList<Entry<Integer, Object>>(records.entrySet()).subList(0, 100);

尽管请注意,这会复制地图中的所有条目。


3
投票

使用库仅复制您需要的记录。

Map<Integer, Object> records;

List<Entry<Integer, Object>> firstHundredRecords = new ArrayList<>();
for(Entry<Integer, Object> entry : records.entrySet()) {
    firstHundredRecords.add(entry);
    if (firstHundredRecords.size()>=100) break;
}

0
投票

以下单行代码将返回映射的前 100 个值,如果映射的值少于 100 个,则返回所有元素。

List<Object> values = map.values().stream().limit(100).toList();

-1
投票

您可以使用计数器。当你的计数器达到 100 时,你的 foreach 循环将退出。


-2
投票

编写一个循环,使用

Iterator.next()
100 次,然后停止。

我本来想说一些关于

NavigableMap
SortedMap
的事情 - 但它们的接口是根据键而不是索引来定义的。但它们可能仍然有用,具体取决于您实际的根本问题是什么。

© www.soinside.com 2019 - 2024. All rights reserved.