当前位置: 首页 > 知识库问答 >
问题:

收集以映射已排序流的Order/Position值

潘青青
2023-03-14

我正在使用预定义的MyComparator对流中填充的MyObject(该对象有一个getName()getter)进行排序。

那么一旦排序,是否有一种方法将MyObject的名称和排序后对象的顺序/位置收集到映射中?

下面是我认为应该是的样子:

Set<MyObject> mySet;  // Already populated mySet 

Map<String, Integer> nameMap = mySet.stream()
        .sorted(myComparator)
        .collect(Collectors.toMap(MyObject::getName, //HowToGetThePositionOfTheObjectInTheStream));

例如,如果集合包含三个对象(名称为name1的object1,名称为name2的object2,名称为name3的object3),并且在对它们进行排序的流中,如何获得如下所示的结果映射:

name1, 1
name2, 2
name3, 3

多谢了。

共有1个答案

姚丰羽
2023-03-14

Javastream不公开元素的任何索引或定位,所以我不知道用streams magic替换/*HowtoGetthePositionoftheObjectintheStream*/以获得所需的数字。

相反,一种简单的方法是收集到list,它为每个元素提供索引。它是从零开始的,所以在转换为映射时,加1。

List<String> inOrder = mySet.stream()
     .sorted(myComparator)
     .map(MyObject::getName)
     .collect(Collectors.toList());
Map<String, Integer> nameMap = new HashMap<>();
for (int i = 0; i < inOrder.size(); i++) {
    nameMap.put(inOrder.get(i), i + 1);
}
 类似资料:
  • 问题内容: 在上面的代码中,我可以期望中的名称顺序始终与中的顺序相同吗? 问题答案: 是的,只要您没有将并行流显式转换为模式,即使您正在使用并行流,也可以期望这样做。 顺序永远不会在顺序模式下更改,但可能会在并行模式下更改。流变得无序: 如果您通过调用将其明确转换为无序模式 如果流源报告它是无序的(例如,流是无序的,因为顺序取决于实现,因此您不能依赖它) 如果您使用的是无序终端操作(例如,进行操作

  • 我有这个代码: 它产生的是 很高兴我应该如何写映射方法来得到一个地图,它会给我:

  • 我有一个问题,希望有人能帮助我提高Java流API的知识。 我的服务通过RabbitMQ以如下数组的形式从另一个服务接收数据: 我需要对这些数据做的是将其收集到用户具有userId的列表和设备id的列表中。因此,从上面的数据来看,它应该是: 我确实有一个可行的解决方案,但它很笨拙 解决方案是: 如何对流执行相同的操作?谢谢

  • 我试图使用JDK 8风格的函数按值对地图进行排序。虽然我得到了排序部分,但我不确定如何在树形图中收集结果。有人能解释一下如何以陈述式的方式完成这项工作吗? 我需要收集另一张