运行 带 Rx 的直方图流
Running histogram stream with Rx
我有以下单字母流
A
B
C
A
D
B
A
C
D
从这个流中,我想要每个字母 运行 计数的流
(A,1)
(A,1), (B,1)
(A,1), (B,1), (C,1)
(A,2), (B,1), (C,1)
(A,2), (B,1), (C,1), (D,1)
(A,2), (B,2), (C,1), (D,1)
(A,3), (B,2), (C,1), (D,1)
(A,3), (B,2), (C,2), (D,1)
(A,3), (B,2), (C,2), (D,2)
,即在每个新字母处,更新并发出总数。
我想这个问题与语言无关,所以不要犹豫,用您选择的语言提出解决方案。
这是如何使用 RxJava
完成的:
final Observable<String> observable = Observable.just("A", "B", "C", "A", "D", "B", "A", "C", "D");
final Observable<LinkedHashMap<String, Integer>> histogram = observable.scan(new LinkedHashMap<>(), (state, value) -> {
if (state.containsKey(value)) {
state.put(value, state.get(value) + 1);
} else {
state.put(value, 1);
}
return state;
});
histogram.subscribe(state -> {
System.out.println(state);
});
输出:
{}
{A=1}
{A=1, B=1}
{A=1, B=1, C=1}
{A=2, B=1, C=1}
{A=2, B=1, C=1, D=1}
{A=2, B=2, C=1, D=1}
{A=3, B=2, C=1, D=1}
{A=3, B=2, C=2, D=1}
{A=3, B=2, C=2, D=2}
在 RxJS
中可能是这样的:
var letters = Rx.Observable.of('A', 'B', 'C', 'A', 'D', 'B', 'A', 'C', 'D'),
histogram = letters.scan(countL, Object.create(null));
histogram.subscribe(console.log.bind(console));
function countL(ls, l) {
if (!ls[l]) ls[l] = 0;
ls[l]++;
return ls;
}
我有以下单字母流
A
B
C
A
D
B
A
C
D
从这个流中,我想要每个字母 运行 计数的流
(A,1)
(A,1), (B,1)
(A,1), (B,1), (C,1)
(A,2), (B,1), (C,1)
(A,2), (B,1), (C,1), (D,1)
(A,2), (B,2), (C,1), (D,1)
(A,3), (B,2), (C,1), (D,1)
(A,3), (B,2), (C,2), (D,1)
(A,3), (B,2), (C,2), (D,2)
,即在每个新字母处,更新并发出总数。
我想这个问题与语言无关,所以不要犹豫,用您选择的语言提出解决方案。
这是如何使用 RxJava
完成的:
final Observable<String> observable = Observable.just("A", "B", "C", "A", "D", "B", "A", "C", "D");
final Observable<LinkedHashMap<String, Integer>> histogram = observable.scan(new LinkedHashMap<>(), (state, value) -> {
if (state.containsKey(value)) {
state.put(value, state.get(value) + 1);
} else {
state.put(value, 1);
}
return state;
});
histogram.subscribe(state -> {
System.out.println(state);
});
输出:
{}
{A=1}
{A=1, B=1}
{A=1, B=1, C=1}
{A=2, B=1, C=1}
{A=2, B=1, C=1, D=1}
{A=2, B=2, C=1, D=1}
{A=3, B=2, C=1, D=1}
{A=3, B=2, C=2, D=1}
{A=3, B=2, C=2, D=2}
在 RxJS
中可能是这样的:
var letters = Rx.Observable.of('A', 'B', 'C', 'A', 'D', 'B', 'A', 'C', 'D'),
histogram = letters.scan(countL, Object.create(null));
histogram.subscribe(console.log.bind(console));
function countL(ls, l) {
if (!ls[l]) ls[l] = 0;
ls[l]++;
return ls;
}