2017-01-03 11 views
0

두 개의 정렬 된 복식을 관찰 할 수 있다고 가정 해 보겠습니다. 나는 그들 사이의 차이점을 관찰 할 수있는 것으로보고 싶습니다. 예를 들어이에 대한두 개의 정렬 된 관측 값 간의 관측 값을 만드는 방법은 무엇입니까?

  1  2   4   
left: ──o───────o───────────o────/ 
      1 3 4 5 
right: ──o────o──o───o───/ 
        l2   r3 r5 
output: ──────────o───────────o────o─/ 

명령형 구현은 간단하다 : 당신은 여전히 ​​도달하고 다른 측면에서 항목을 "방출"적이 없다 측면에있는 항목의 목록을 유지합니다.

RFP 세계에서 표준 접근 방식은 무엇입니까? 나는 특별히 RxScala를 사용하고 있습니다.

+0

소스의 값이 방출 될 때와 그 결과로 관찰 가능하게되는 결과를 표시하는 대리석 다이어그램을 제공 할 수 있습니까? – Enigmativity

+0

@Enigmativity 대리석 다이어그램을 추가했습니다. HTH –

+0

그것은 멋진 대리석 다이어그램입니다. 어떻게 그걸 만들었 니? 나는 아직도 규칙을 이해할 수 없다. 설명해 주시겠습니까? – Enigmativity

답변

2

이것은 rxjava에서 두 관측 값의 길이가 같음을 의미합니다.

Observable<Integer> obs1 = Observable.just(1, 2, 4, 6); 
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5); 

    obs1.zipWith(obs2, (integer, integer2) -> { 
     if (!Objects.equals(integer, integer2)) { 
      return Observable.just(integer).concatWith(Observable.just(integer2)); 
     } else { 
      return Observable.empty(); 
     } 
    }) 
     .flatMap(observable -> observable) 
     .sorted() 
     .forEach(System.out::println); 

편집

또 다른 방법은 모음 내가 그 "실시간"대칭 차이 할 RxJava에서 많이 없다고 생각

Observable<Integer> obs1 = Observable.just(1, 2, 4); 
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5); 


    obs1.mergeWith(obs2) 
      .sorted() 
      .reduce(new ArrayList<Integer>(), (integers, integer) -> { 
       if (integers.contains(integer)) { 
        integers.remove(integer); 
       } else { 
        integers.add(integer); 
       } 
       return integers; 
      }) 
      .flatMapIterable(integers -> integers) 
      .forEach(System.out::println); 
+0

당신은 여기에서 두 가지 가정을하고 있습니다 : 1. 관측 자료의 길이가 동일하다는 것을 나타냅니다. 2. 관측 대상 중 하나가 다른 관측 점보다 훨씬 앞서있을 수 없습니다 (동일한 속도로 진행됨). –

+0

이 새로운 접근 방식은 관찰 대상이 모두 완료 될 때까지 차단이 필요하지 않습니까? –

+0

@OmervanKloeten 아니요, 차단 기능이 없습니다. 모든 운영자가 비 차단 관찰 데이터를 생성하고 있습니다. –

1

을 사용하는 것입니다. .. 당신의 시작 가정 (관측 가능한 것들이 정렬 됨)이 일반 연산자들에 의해 만들어 질 수 없기 때문에 주로 당신을 도와 줄 것입니다.

그러나 sequenceEqual에서 영감을 얻어 맞춤형 연산자를 코딩 할 수 있습니다. 즉, 두 게시자간에 단계별로 진행되어 평등 비교를 수행하므로 수행하려는 작업에 가깝습니다.