Wielokryterialne sortowanie listy obiektów z kolejnością Guava
Mam klasę, KTÓRA NIE MOŻE zaimplementować porównywalnej, ale musi być posortowana na podstawie 2 pól. Jak mogę to osiągnąć dzięki Guava?
Powiedzmy, że klasa jest:
class X {
String stringValue;
java.util.Date dateValue;
}
Mam ich listę:
List<X> lotsOfX;
Chcę je najpierw posortować w oparciu o pole wartości, a następnie bazując na dateValue malejącym w obrębie każdej „grupy” pól „value”.
Do tej pory robiłem:
List<X> sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(dateValueSortFunction).reverse().sortedCopy(lotsOfX));
sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(stringValueSortFunction).sortedCopy(sortedList));
Funkcje są zdefiniowane jako:
public class DateValueSortFunction<X> implements Function<X, Long> {
@Override
public Long apply(X input) {
return input.getDateValue().getTime(); //returns millis time
}
}
I:
public class StringValueSortFunction<X> implements Function<X, Integer> {
@Override
public Integer apply(X input) {
if(input.getStringValue().equalsIgnoreCase("Something"))
return 0;
else if(input.getStringValue().equalsIgnoreCase("Something else"))
return 1;
else
return 2;
}
}
Oczekiwane wyjście wsortedList
jest:
Something 03/18/2013
Something 03/17/2013
Something else 03/20/2013
Something else 03/19/2013
....
Moje podejście działa, ale jest oczywiście niewystarczające do dwukrotnego przeglądania listy. Czy jest na to lepszy sposób?
Używam tego w aplikacji GWT. Wdrożenie porównywalne nie jest opcją.