【问题标题】:How to fetch first 10 key value pairs in HashMap如何在 HashMap 中获取前 10 个键值对
【发布时间】:2012-04-12 23:54:09
【问题描述】:

我试图只迭代我的地图中的前“n”个值,是否有任何可用的方法,或者我只需要使用计数变量来控制它。

下面是一个例子,我对一组属于同一个城市的名字进行了排序。现在我只想要前 10 个城市和其中的人名。

for (Map.Entry<String, List<String>> entry : map.entrySet()) {
    List<String> list = entry.getValue();
    // Display list of people in City
}

是否有可以保存固定数量的键值对的 Map 实现? 请获取一些指示。

谢谢,

-维杰·塞尔瓦拉杰

【问题讨论】:

  • 您是要防止添加超过 10 个条目,还是要添加任意 10 个条目,还是要添加前 10 个条目?更多细节。
  • 我的目标是有 10 个条目。现在我把它填满,然后取整个的一个子集。但是当我达到 10 个条目时,我可以很好地停止。

标签: java collections hashmap


【解决方案1】:
List<List<string>> list = new ArrayList<List<String>>();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
  if (list.size() > 9) break;
    list.add(entry.getValue());
}

【讨论】:

  • OP 表示他知道如何使用计数器变量来做到这一点
【解决方案2】:

我正在尝试仅迭代 Map 中的前“n”个值,是否有任何可用的方法,或者我只需要使用计数变量来控制它。

您会发现仅使用标准 Collections API(仍然比计数器变量 IMO 稍差)最接近的情况如下:

List<Map.Entry<String, List<String>> entryList =
        new ArrayList<Map.Entry<String, List<String>>(map.entrySet());

for (Map.Entry<String, List<String>> entry : entryList.subList(0, 10)) {
    List<String> list = entry.getValue();
    // Display list of people in City
}

使用 Java 7 中的花式菱形可以避免冗长的类型参数:

List<Map.Entry<String, List<String>> entryList = new ArrayList<>(map.entrySet());

或者通过使用迭代键和.get对应的值。

【讨论】:

  • 刚看了Hashmap和Set,没有subList方法,请问是哪来的?
  • @Churk:它来自ArrayList,由map.entrySet()的内容构成。
  • @aix map.entrySet() 返回一个集合,而不是一个数组列表
  • @Churk:对。 new ArrayList&lt;...&gt;(...) 创建 ArrayList,然后在其上调用 subList()
  • @Churk,我通过 ArrayList(Collection&lt;? extends E&gt; c) 构造函数。稍微澄清一下答案中的代码。
【解决方案3】:

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

HashMapis unordered。这使得问题不恰当(除非“第一”是指“任意”)。

如果您想要一致的键顺序,您需要将映射的类型更改为SortedMap,例如TreeMap

或者,如果它是您所追求的最旧的元素(即您首先插入的元素),那么LinkedHashMap 就是答案。

关于实际获取第一个 n 元素,带有计数器的循环是一种非常合理的方法。

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 2010-11-25
    • 2013-04-21
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多