android rxjava Sortierliste mit Komparator-Klasse

8

Ich habe angefangen, rxjava mit meinen Android-Projekten zu benutzen. Ich muss die Ereignisliste von einem API-Aufruf sortieren. Ich schrieb Komparator-Klasse, um Liste zu sortieren:

%Vor%

Ich kann diese Klasse mit der klassischen Collections-Klasse verwenden.

%Vor%

Wie kann ich diese Situation auf reaktive Weise erreichen? Auch wenn es eine Möglichkeit gibt, die Liste asynchron zu sortieren, würde ich das bevorzugen.

Reaktiver Weg ohne Sortierliste:

%Vor%     
okarakose 26.10.2016, 16:19
quelle

4 Antworten

9

Wenn ich das Javadoc für Collections.sort() , ich hätte etwas wie map (list -> Collections.sort (list, comparator)) , um es in ein sortiertes Array zu konvertieren; Hier ist map der beobachtbare Mapper.

Die obige Methode sort ist jedoch ein In-Place-Sortieralgorithmus, der das zugrunde liegende Array beeinflusst und nicht das vollständig sortierte Array zurückgibt. Also solltest du stattdessen so etwas tun:

%Vor%

Dies sortiert jede eingehende List<EventParticipant> einzeln und asynchron.

    
Larry B. 26.10.2016, 16:35
quelle
11

Diese Lösung ähnelt der akzeptierten Antwort, verwendet aber Rx-Operatoren, um 1) das Array in Objekte aufzuteilen 2) nach den Instanzen zu sortieren Vergleichbare Implementierung 3) auf einem dedizierten Berechnungs-Thread;

%Vor%

Beachten Sie, dass Schedulers.io für Netzwerk- / Festplattenschreibvorgänge, Schedulers.computation für Berechnungen wie Sortieren

bevorzugt wird     
Pär Nils Amsen 26.10.2016 17:56
quelle
3

Ich gehe davon aus, dass die Methode getParticipants() Observable<List<EventPartcipant>> zurückgibt.

Im folgenden Ausschnitt konvertiere ich zuerst Observable<List<EventPartcipant>> in Observable<EventParticipant> mit dem Operator flatMap() . Diese Observable gibt jeweils EventParticipant einzeln aus. Jetzt kann ich mit dem toSortedList() -Operator gleichzeitig auf zwei EventParticipant -Objekte zugreifen, genau wie Comparator<EventParticipant>::compareTo erwartet.

In den anderen Lösungen werden Sortieroperatoren nach .observeOn(AndroidSchedulers.mainThread()) angewendet, was bedeutet, dass die eigentliche Sortierung im UI-Thread erfolgt.

Ich habe dies geändert, damit der API-Aufruf im E / A-Scheduler ausgeführt werden kann, wobei der Berechnungsplaner und schließlich die sortierte Liste im UI-Thread sortiert wird.

%Vor%     
Arun kumar 25.11.2016 08:24
quelle
1

Es gibt noch eine weitere Möglichkeit, die Liste zu sortieren

%Vor%     
aleksandrbel 06.01.2018 10:57
quelle