【问题标题】:Why sorted operation impose an encounter order to a Stream?为什么排序操作将遇到顺序强加给流?
【发布时间】:2019-12-03 19:49:42
【问题描述】:

sorted operation 的文档说:

对于有序流,排序是稳定的。对于无序流,不保证稳定性。

page-summary 说:

一些中间操作,例如 sorted(),可能会施加遇到顺序

有人能解释一下为什么sorted 操作需要对 Stream 的遭遇顺序(我没有看到遭遇顺序的存在与排序操作之间的关系)吗?

这是否意味着以下代码无效(因为 HashSet 本质上不是有序的)?

Set<Integer> mySet = new HashSet<>();
mySet.add(10);
mySet.add(4);
mySet.add(20);
mySet.add(15);
mySet.add(22);
mySet.add(-3);

List<Integer> result = mySet.stream().sorted().collect(Collectors.toList());

System.out.println(result);

当我运行这段代码时,它总是给我同样的输出[-3, 4, 10, 15, 20, 22]

事件如果我使用.parrallel(),输出保持不变[-3, 4, 10, 15, 20, 22]

mySet.stream().parallel().sorted().collect(Collectors.toList());`

【问题讨论】:

  • 问题是,如果排序不稳定,相同的项目可能不在它们开始的相同位置。如果正在排序的项目中有其他属性,这一点很重要。在您的示例中,这是无关紧要的,因为只有一个值,一个整数。 This 也可能有帮助。
  • 所以只有equals项是不可预测的?
  • 这是我的理解。
  • 应该已经写在文档里了,因为不是很清楚。这篇 stackoverflow.com/questions/41894173/… 的帖子展示了一个关于 disinct 如何受订单影响的具体示例
  • 请注意parallel() 不需要并行操作。这只是一个建议。而对于那少量的项目,Java 很可能不会听从你的建议。

标签: java java-stream


【解决方案1】:

当我运行这段代码时,它总是给我相同的输出

是的。它按预期对集合进行排序。您似乎误解了“稳定”一词。排序中的稳定性是指不移动相等的元素。

稳定的排序算法以相同的顺序对重复的元素进行排序 它们出现在输入中

Read more on Wikipedia

你的列表没有重复元素,所以稳定性不适用,不能通过观察输出来判断稳定性。

有人可以解释为什么排序操作需要遇到顺序 流

它没有。引用说它可能“施加一个遭遇令”。也就是说,sort 操作之后会有一个定义的遭遇顺序,而不是必须有一个之前

【讨论】:

  • 我误解了文档,我认为它之前需要一个遇到的订单,实际上它可能会在之后产生一个遇到的订单流。感谢您对stability 的澄清,我不知道这个词。
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多