Как удалить дубликаты на основе предыдущей эмиссии в элементе списка - PullRequest
0 голосов
/ 04 июня 2019

У меня есть Observable из Lists:

Observable<List<String>> source = Observable.just(
        List.of("a", "c", "e"),
        List.of("a", "b", "c", "d"),
        List.of("d", "e", "f")
);

Как удалить дубликаты так:

[a,c,e][a,b,c,d][d,e,f] => [a,c,e][b,d][f]

Это нормально для меня, чтобы накапливать предыдущие выбросы, просто нужно преобразование, как указано выше.

1 Ответ

1 голос
/ 04 июня 2019

Я реализовал это с помощью оператора scan и вспомогательного класса, в котором хранятся текущие и предыдущие значения:

static class Distinct {
    final HashSet<String> previous;
    final List<String> current;

    public Distinct(HashSet<String> previous, List<String> current) {
        this.previous = previous;
        this.current = current;
    }
}

Observable<List<String>> source = Observable.just(
        List.of("a", "c", "e"),
        List.of("a", "b", "c", "d"),
        List.of("d", "e", "f")
);

source.scan(new Distinct(new HashSet<>(), new ArrayList<>()), (acc, item) -> {
    var newItem = new ArrayList<String>();
    item.forEach(i -> {
        if (acc.previous.add(i))
            newItem.add(i);
    });
    return new Distinct(acc.previous, newItem);
})
        .skip(1)
        .map(md -> md.current)
        .subscribe(System.out::println);

Выход:

[a, c, e]
[b, d]
[f]
...