代码之家  ›  专栏  ›  技术社区  ›  user1428716

在SQL中组合类似列表的联接

  •  0
  • user1428716  · 技术社区  · 6 年前

    我有两个可以观察到的字符串列表。

    我想在RXJava中使用zip或任何其他操作实现类似的功能。

    如果列表1有数据,而列表2没有任何数据-请考虑列表1的数据集。

    如果list1没有数据,list2有任何数据-考虑list2的数据集。

    如果list1和list2都有数据,则取两个列表的交集。

    这不起作用->

            String[] LEFT = { "1", "2", "3", "4" };
            String[] RIGHT = { "5", "6", "7", "8" };
            Observable<String> LEFT_Observable = Observable.fromArray(LEFT);
            Observable<String> RIGHT_Observable = Observable.fromArray(RIGHT);
            ArrayList<String> result = new ArrayList<String>();
            System.out.println("HI");
            LEFT_Observable.join(RIGHT_Observable, i -> Observable.just(i), j -> Observable.just(j), (l, r) -> {
                System.out.println(l);
                System.out.println(r);
                result.add(l);
                return l + r;
            }).take(10).subscribe(System.out::println);
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   homerman    6 年前

    我采取的方法是:

    • merge 两条小溪
    • filter 考虑到“左”和“右”源的空/空的每个值
    • 应用 distinct 删除重复项

    一切都是这样的:

      @Test
      public void find_intersection_between_two_lists() {
        final List<String> leftValues  = Arrays.asList("1", "2", "3");
        final List<String> rightValues = Arrays.asList("1", "2", "4");
    
        final Observable<String> left  = Observable.fromIterable(leftValues);
        final Observable<String> right = Observable.fromIterable(rightValues);
    
        Observable.merge(left, right)
            .filter(value -> {
              if((leftValues == null || leftValues.isEmpty()) && (rightValues != null && !rightValues.isEmpty())) {
                return rightValues.contains(value);
              } else if((leftValues != null && !leftValues.isEmpty()) && (rightValues == null || rightValues.isEmpty())) {
                return leftValues.contains(value);
              } else {
                return leftValues.contains(value) && rightValues.contains(value);
              }
            })
            .distinct()
            .subscribe(
                result -> {
                  System.out.println("## onNext(" + result + ")");
                },
                error -> {
                  System.out.println("## onError("+ error.getMessage() + ")");
                },
                () -> {
                  System.out.println("## onComplete()");
                }
            );
      }
    

    这个 滤波器 代码很难看。我想知道是否有一种更习惯的方法来做这件事…但它起作用了。

    如果没有别的,希望它至少能激发一些想法!