【问题标题】:Skipping an index while iterating a Map in Java在 Java 中迭代 Map 时跳过索引
【发布时间】:2018-08-15 06:33:57
【问题描述】:

您好,期待您在 Java 中的 Map 迭代期间跳过索引的帮助。 我有一个包含 10 个元素的地图,我想跳过索引 8 上的元素如何实现目标。 我尝试使用streams() 的skip() 方法,但它正在从开始跳过元素到您输入的计数。以下是我的方法...

public void copyRow(Row row){
        this.clear();
        row.entrySet().stream().skip(8).forEach(e ->
        this.put(e.getKey(),new Cell(e.getValue().getRowNo(),e.getValue().getColNo(),e.getValue().getValue()))
        );

有没有办法在流中做到这一点,或者还有其他方法吗?

【问题讨论】:

  • 这是什么类型的地图?
  • "map" 和 "index" 通常不兼容。即使是排序的地图也没有明确的索引概念,而是所有位置操作(头、尾等)都基于元素比较。因此,如果您有一个排序的地图并且知道什么元素应该位于“索引”8(或 9)处,您可以使用 tailMap(element at 9)(包括传递的元素)。
  • 顺便说一句,对我来说Row 表示的不仅仅是一张简单的地图。如果是这种情况,可能有比使用条目集更好的东西,我们只需要知道 Row 实际上是什么。
  • 另一个想法:如果entrySet() 提供的顺序对您来说没问题(取决于您拥有的地图,请注意,除非它是排序的地图,否则该顺序可能不是确定性的)您可以尝试2 步方法:首先使用 limit(7) 获取前 7 个元素,然后使用 skip(8) 获取元素 9+。 - 免责声明:请先阅读所有其他 cmets 和答案,然后尝试选择更合适的方法。仅将其用作最后的手段。

标签: java hashmap iteration java-stream


【解决方案1】:

哈希映射没有排序,因此没有“索引”的概念。没有人知道索引 8 处的条目是什么 - 可能每次都不同。

一个更好的主意是检查密钥。如果没有与您要跳过的值关联的固定键,您可能应该设计数据的存储方式。因为如果这是真的,那么您是基于不存在的“索引”概念存储数据,这不太好。

要跳过特定键,只需调用filter

row.entrySet().stream()
    .filter(e -> !e.getKey().equals(someKeyThatIdentifiesTheEntryAtIndex8))
    .forEach(e ->
        this.put(e.getKey(),new Cell(e.getValue().getRowNo(),e.getValue().getColNo(),e.getValue().getValue()))
    );

如果您使用的是具有“索引”概念的集合,例如数组或列表,您可以这样做:

int[] a = {1,2,3,4,5,6,7,8,9,10,11};

IntStream firstPart = Arrays.stream(a).limit(7);
IntStream secondPart = Arrays.stream(a).skip(8);
IntStream finalStream = IntStream.concat(firstPart, secondPart);
finalStream.forEach(System.out::println);

【讨论】:

  • 非常感谢您。我会尽力回复你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2021-05-03
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2015-05-24
相关资源
最近更新 更多