java - 当每个元素上的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定

标签 java sorting observable rx-java

我无法理解在 1 个排放被解包到多个项目后如何对排放进行排序。我有以下代码,请允许我从功能上解释一下。

  • 数据库中自上而下的内容结构为 A 1:n B 1:n C
  • 在这个返回逻辑中我们改变了上面的内容;一个 A 可以直接在下面有多个 B 和/或 C(未打包的 B)<
  • 所有类型均从共享父级 Z 扩展,该父级在重写的 compareTo 上使用自定义 Comparator 实现 Comparable按子类类型的唯一升序 int id 进行排序(因此对于 BC 从 0 重新开始)
  • enrichB 根据某些类型元数据返回单个 B 多个 C<
  • addChildrenToA 只是一个构建器 (.with)
private Observable<A> getChildren(final A a) {
    final Observable<List<B>> bList = containerService.getBs(a)
            .toSortedList();

    final Observable<? extends List<? extends Z>> children = bList
            .flatMapIterable(items -> items)
            .flatMap(b -> enrichB(b))
            .toList();

    return Observable.zip(
            Observable.just(A),
            children,
            this::addChildrenToA);
}

如果我删除这一行:

.flatMap(b -> enrichB(b))

列表将仅包含B,因为不会发生解包(在enrichB步骤中)。这总是在返回的列表中产生稳定的排序顺序:

B0B1B2B3B4

当我启用该行时,一个 B 会转换为多个 C(其中一个项目)。我期望(或者可能希望)这会作为输出发生:

B0B1B2C1C2 >C3B4(B3 已解压)

但是..我得到的输出例如:

B0B1C1C2C3B2B4

B0C1C2C3B1B2B4

B0B1B2B4C1 >C2C3

所以“内部”的排序被保留,但为什么“整体”的排序变得不稳定?我的怀疑是因为 flatMap 将继续对 enrichBtoList() 添加操作,并且由于展开需要更多时间(波动)它比其他操作“插入”在随机位置的时间要长。

  1. 我的怀疑是正确的还是我遗漏了其他内容?
  2. 如何控制/阻止此流程以保持稳定的秩序?最好没有脏东西,例如修改模型 C 以包含 Bid 并更改使用的 Comparator

最佳答案

所以答案是使用concatMap而不是 flatMap

private Observable<A> getChildren(final A a) {
final Observable<List<B>> bList = containerService.getBs(a)
        .toSortedList();

final Observable<? extends List<? extends Z>> children = bList
        .flatMapIterable(items -> items)
        .concatMap(b -> enrichB(b))
        .toList();

return Observable.zip(
        Observable.just(A),
        children,
        this::addChildrenToA);
}

关于java - 当每个元素上的操作产生不同的结果计数/持续时间时,保持初始可迭代排序顺序稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61007973/

相关文章:

java - 如何检测消息(字符串)中的电话号码,突出显示它们并允许用户在 Android 中调用这些号码?

javascript - 根据与另一个数组的最佳匹配对对象数组进行排序

android - 如何重试消耗的 Observable?

c# - 在 C# 中使用 Java 类

java - 如何找到重复/重复的数组值并将其显示在输出中?

java - Droptiles by Omar AL Zabir 支持哪些 HTML5 功能?

javascript - 这个 jQuery 排序函数是如何工作的?

php - 如何根据php中的日期列对mysql结果数组进行降序排序?

node.js - 以流的方式聆听 Promise

c# - volatile 关键字可以用于构建线程安全的自动清除缓存吗?