两个有序可观察量的完全外连接

2023-12-13

假设我们有两个可观察量Observable<Integer> o1 and Observable<Integer> o2每个可观察量都产生严格递增的序列。

任务是对这两个可观察量执行相当于完全外连接的操作。例如加入

    Observable.just(0, 2, 3, 6)
    Observable.just(1, 2, 3, 4, 5, 6)

应该产生

    [ [0, _], [_, 1], [2, 2], [3, 3], [_, 4], [_, 5], [6, 6] ]

连接应该高效并且在非常大或无限的流上运行良好。

该解决方案在拉动场景中很容易。有没有一种惯用的 rx 方法来实现这一目标?


没有单一的运算符可以实现此目的,但可以从标准和扩展运算符组成行为:

static abstract class Pair implements Comparable<Pair> { 
    int value;

    @Override
    public int compareTo(Pair o) {
        return Integer.compare(value, o.value);
    }
}

static final class Left extends Pair {
    Left(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "[" + value + ", _]";
    }
}

static final class Right extends Pair {
    Right(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "[_, " + value + "]";
    }
}

static final class Both extends Pair {
    Both(int value) {
        this.value = value;
    }

    @Override
    public int hashCode() {
        return value;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Both) {
            return ((Both)obj).value == value;
        }
        return false;
    }

    @Override
    public String toString() {
        return "[" + value + ", " + value + "]";
    }
}

@SuppressWarnings("unchecked")
@Test
public void test() {
    Flowable<Integer> a = Flowable.just(0, 2, 3, 6);
    Flowable<Integer> b = Flowable.just(1, 2, 3, 4, 5, 6);

    Flowable.defer(() -> {
        boolean[] skip = { false };
        return Flowables.<Pair>orderedMerge(
                a.<Pair>map(Left::new), b.<Pair>map(Right::new)
            )
            .distinctUntilChanged()
            .buffer(2, 1)
            .flatMapIterable(buf -> {
                if (skip[0]) {
                    skip[0] = false;
                    return Collections.emptyList();
                }
                if (buf.size() == 2) {
                    if (buf.get(0).value == buf.get(1).value) {
                        skip[0] = true;
                        return Collections.singletonList(new Both(buf.get(0).value));
                    }
                    return buf.subList(0, 1);
                }
                return buf;
            });
    })
    .subscribe(System.out::println);
}

where Flowables.orderedMerge在里面RxJava 2 扩展库.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个有序可观察量的完全外连接 的相关文章

随机推荐

  • 正则表达式 - 以特定字符串开头但不以另一个子字符串结尾

    给定两个字符串s1 and s2 我正在尝试编写一个正则表达式来匹配以s1但不以s2 示例 s1 测试 s2 坏 TEST 101比赛 测试一些 DESC 匹配 TEST 101 BAD 不应匹配 TEST SOME DESC BAD 不应
  • 无法让 Elasticsearch 与 Django 一起使用

    我正在尝试在 Ubuntu 14 04 上使用 Django 和 Haystack 以及 Elasticsearch 作为后端 我安装了 Elasticsearch 和 Haystack 运行 python manage py runser
  • 设计一个具有延迟加载属性的 Java POJO

    请考虑下面的例子 Web 应用程序为每个登录用户创建一个用户对象 这个对象有简单的String属性为firstName lastName 每个用户都可以拥有一个car也 考虑获取用户car非常昂贵 因此我们不希望在用户登录时设置用户的汽车
  • 无法使用 WebSockets 连接,未更改readyState

    我尝试了几种方法 甚至复制 粘贴http code google com p phpwebsocket 我使用 Google Chrome 5 0 375 70 beta 错误总是相同的 错误 INVALID STATE ERR DOM 异
  • Groovy Power 打印

    Groovy 有一个电源断言 但我想要一个电源打印 例如 def foo banna5 monkey 7 x 70 println foo foo monkey monkey x 2 x 2 看到 println 行中重复的 foo mon
  • 如何匹配CIM/RDF中的JAXB元素?

    尝试根据 IEC 61970 通用信息模型 用于电力系统模型 从 CIM XML 文件加载模型时 我发现了一个问题 根据 JAXB 元素之间的图表由 XmlREF XmlID 提供 并且这两者应该等于匹配 但在 CIM RDF 中 通过 I
  • 插入地图的首选/惯用方式是什么?

    我已经确定了将元素插入到 a 中的四种不同方法std map std map
  • 从区域和时间创建 std::chrono::zoned_time

    我有一个柏拉图意义上的日期时间 即某个日期和时间 例如 2022 年 1 月 18 日 15 15 00 并且我知道它代表哪个时区 例如 欧洲 莫斯科 我想创建std chrono zoned time 有可能吗 我在看构造函数似乎他们都需
  • C# MVC 视图之间没有提交传递对象

    我对我的拼写错误感到抱歉 我正在开发概念验证 C ASP NET MVC 应用程序 其中我需要在没有 post 和 get 的情况下在两个视图之间传递数据 一个视图启动一个模式对话框 我需要它们之间的通信 我们正在使用 JQuery 我有一
  • Android ListView 使用 SimpleCursorAdapter 更新

    嘿 我使用列表视图来演示存储在数据库中的条目 我还有一个 EditText 元素和一个将 EditText 的内容添加到数据库中的按钮 要将视图绑定到数据库内容 我使用 SimpleCursorAdapter 和以下填充函数 private
  • 如何更改 Java Swing TextArea 中的突出显示颜色?并且,更改与突出显示位置相对应的文本开头

    问题 1 通过使用默认荧光笔 我可以使聚焦线变为蓝色 现在我想把它改成其他颜色 有谁知道如何更改这个参数 解决了 问题 2 pos 是我想要突出显示的子字符串的开始索引 我使用 setCaretPosition pos 更新显示内容 但它始
  • 在Python中使用继承

    这是我的作业 我之前在网站上看到过它 但看起来它尚未解决 并且我收到的错误消息与之前提出该问题的人不同 问题的第一部分是定义从 Employee 继承的子类 Worker 并包含一个引用另一个员工 该员工的经理 的属性 您应该定义一个方法
  • JMeter:如何知道为什么 JMeter 中的正则表达式提取器没有提取数据

    我想知道为什么 JMeter 中的正则表达式提取器在参数化后不提取数据 响应消息 内部服务器错误 添加的表达式有 名称 EVENTVALIDATION id EVENTVALIDATION 值 名称 VIEWSTATE id VIEWSTA
  • 将 ASP.NET 应用程序连接到 QuickBooks Online Edition

    我正在尝试创建一个连接到 QuickBooks Online Edition 的 ASP NET 页面 读取几个值并显示结果 到目前为止 我已经下载了 QuickBooks SDK 但我无法找到有关如何创建 asp net 页面以连接到 Q
  • 如何将 IN 与块而不是对象一起使用?

    Rebol 中的 IN 函数查找字段是否在对象中 USAGE IN object word DESCRIPTION Returns the word or block in the object s context IN is a nati
  • 如何检测来电和去电结束状态? iPhone

    我有一个要求 即应用程序应在安装后消失 并且在来电或去电时 在通话后不久应用程序应提示并显示屏幕 安装后如何消失应用程序 如何检测来电和去电 来电和去电结束后如何显示屏幕 最主要的是我是为个人而不是应用商店制作这个 因此 如果您有任何想法
  • SVN如何解决在两个分支上添加文件时的新树冲突

    当合并几个分支 使用 SVN 1 6 1 时 两个分支上都添加了一个文件 然后在这些单独的分支中处理 我遇到了新的树冲突之一 C foo txt gt local obstruction incoming add upon merge 我需
  • 通过替换字符重命名文件并覆盖

    在 Windows XP 上 在文件文件夹中 我需要重命名一些文件 将文件名中的一个字符替换为另一个字符 并覆盖任何已具有该名称的文件 例如 该文件夹包含以下 2 个文件 fileA xml fileb xml 我需要重命名fileA xm
  • 如何设置鼠标位置?

    我需要设置鼠标在屏幕上的位置 在其他一些类似的问题中 建议使用CGDisplayMoveCursorToPoint CGDirectDisplayID display CGPoint point 但我不知道如何获得CGDirectDispl
  • 两个有序可观察量的完全外连接

    假设我们有两个可观察量Observable