如何通过Rx函数对列表进行排序,我的列表包含三种不同的源,然后我想显示使用日期排序的列表,如何使用RxAndroid应用它?
subscriptions.add(complaintsAPI.getComplaintsAPI(userDetails.getUsername())
.compose(ReactiveUtils.applySchedulers())
.map(list -> {
List<ComplaintsRowModel> rowModel = new ArrayList<>();
for (Complaint complaint : list.getComplaints()) {
rowModel.add(new ComplaintsRowModel(complaint.getDisputeNo(),
complaint.getOpenDate(), complaint.getArea(), complaint.getStatus()));
model.complaintsList.put(complaint.getDisputeNo(), complaint);
}
for (OnlineRequest onlineRequest : list.getOnlineRequests()) {
rowModel.add(new ComplaintsRowModel(onlineRequest.getRequestNo(), onlineRequest.getOpenDate(),
onlineRequest.getArea(), onlineRequest.getStatus()));
model.complaintsList.put(onlineRequest.getRequestNo(), onlineRequest);
}
for (LlTickets llTickets : list.getLlTickets()) {
rowModel.add(new ComplaintsRowModel(llTickets.getTicketNo(), llTickets.getOpenDate(),
llTickets.getType(), llTickets.getStatus()));
model.complaintsList.put(llTickets.getTicketNo(), llTickets);
}
return rowModel;}
).toSortedList(){
//how to sort here
}).subscribe(new RequestSubscriber<List<ComplaintsRowModel>>(view.getContext(), view.progressView) {
@Override
public void onFailure(RequestException requestException) {
view.showError(requestException);
}
@Override
public void onNoData() {
super.onNoData();
isAllDataLoaded = true;
view.noDataFound();
model.setNoDataFound(true);
}
@Override
public void onNext(List<ComplaintsRowModel> complaintsRowModels) {
isAllDataLoaded = true;
model.setRowModel(complaintsRowModels);
view.buildList(complaintsRowModels);
}
}));
我认为在toSortedList()
我可以对列表进行排序,但我不知道如何应用它。
答案 0 :(得分:3)
toSortedList
运算符仅适用于Observable<ComplaintRowModel>
,而您所拥有的运算符为Observable<List<ComplaintRowModel>>
。首先,您必须使用
flatMapIterable(complaintRowModels -> complaintRowModels)
将其映射到列表元素的可观察对象。然后你可以应用类似
的排序toSortedList((complaintRowModel, complaintRowModel2) -> {
Date date = complaintRowModel.getDate();
Date date2 = complaintRowModel2.getDate();
// comparing dates is very much dependent on your implementation
if (date <before> date2) {
return -1;
} else if (date <equal> date2) {
return 0;
} else {
return 1;
}
})
然后你会得到一个可观察的排序列表。
答案 1 :(得分:1)
根据您的要求,您不想提供有关您问题的具体信息,这是一般答案。
当需要排序的数据对象实现scala> val in = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
in: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
scala> in.transpose
res0: List[List[Int]] = List(List(1, 4, 7), List(2, 5, 8), List(3, 6, 9))
scala> in.transpose.map(_.sum)
res1: List[Int] = List(12, 15, 18)
或它的原始类型时。
Comparable
[1,2,3]
Observable.just(3, 2, 1)
.toSortedList()
.subscribe(list -> System.out.print(Arrays.toString(list.toArray())));
或实现它时,您需要指定您希望如何对数据进行排序。该示例说明了如何按Comparable
字段按降序对对象列表进行排序。
val
[ToSort {val = 3},ToSort {val = 2},ToSort {val = 1}]
答案 2 :(得分:0)
重复
的不同方法// comparing dates is very much dependent on your implementation
if (date <before> date2) {
return -1;
} else if (date <equal> date2) {
return 0;
} else {
return 1;
}
使用static import java.util.Comparator.comparing;
您可以使用日期对象内部的方法引用进行比较。
实施例。
在这种情况下,unsortedDevices
是一个标准的ObservableList,用于TablView。
SortedList<HistoryDisplayItem> sortedItems = new SortedList<>(unsortedDevices,
comparingInt(HistoryDisplayItem::getNumber));