java - RxJava 分组排序数据
问题描述
我有一个非常大的数据集合,原始数据已经按照关键的内容进行了排序。例如,我有一个 CSV 文件,第一列将成为分组的关键。
A,x,x,x
A,x,y,x
A,z,y,y
C,x,s,d
C,t,d,s
B,a,s,a
E,x,x,x
E,t,r,y
这些行被转换为对象并放入一个列表并使用 RxJava 进行流式传输Flowable
。因为这个 CSV 会很大(大到会导致应用程序崩溃),有没有一种好方法可以将这些对象转换为地图条目,如下所示:
{ 'A': [[x,x,x],[x,y,x],[z,y,y]] }
解决方案
我现在正在使用FlowableTransformers.partialCollect
。一个例子是
Flowable.fromPublisher(FlowableTransformers.partialCollect(
(Consumer<PartialCollectEmitter<LineData, Integer,
ListBuilder, ListDataModel>>) emitter -> {
// Get or initialize collecting object
ListBuilder lb = emitter.getAccumulator();
if (lb == null) {
lb = new ListBuilder();
emitter.setAccumulator(lb);
}
if (emitter.demand() != 0) {
boolean d = emitter.isComplete();
if (emitter.size() != 0 && !d) {
LineData data = emitter.getItem(0);
emitter.dropItems(1);
// add returns the finished model if the prefix changes
ListDataModel model = lb.add(data);
if (model != null) {
emitter.next(model);
}
} else if (d) {
if (!lb.isEmpty()) {
// clear returns the last model
emitter.next(lb.clear());
}
emitter.complete();
return;
}
}
emitter.setIndex(0);
}, Functions.emptyConsumer(), settings.getReadBufferSize() + 1).apply(
Flowable.fromIterable(file.getFileNameList())
.concatMap(
fileName -> reader
.getLineData(fileName)
.buffer(settings.getReadBufferSize()))
.flatMap(Flowable::fromIterable)))
推荐阅读
- c++ - 从 tcp 服务器打开 8MP H264 流的问题
- caching - 具有多个路径的 GitLab CI 缓存似乎跳过了一个路径
- javascript - 单选按钮 Work like dropDown(选择选项)
- reactjs - 如何修复此错误在多个渲染()操作期间无法使用相同的画布
- ruby-on-rails - Rails 5:当我在开发中设置 cookie 存储时,我从设计中获得了无效的真实性令牌
- laravel - 在 Laravel 中上传头像注册失败
- react-native - React Native 测量网络带宽使用情况
- ionic-framework - 离子服务在编译 ionic 3 项目时花费了太多时间,例如 4 到 6 分钟
- docker - 关于容器化的 Docker 查询
- cordova - 离子找不到'localforage'的类型定义文件