Clasificación de criterios múltiples de una lista de objetos con Ordenamiento de Guayaba
Tengo una clase que NO SE PUEDE implementar, pero se debe clasificar en función de 2 campos. ¿Cómo puedo lograr esto con la guayaba?
Digamos que la clase es:
class X {
String stringValue;
java.util.Date dateValue;
}
Y tengo una lista de estos:
List<X> lotsOfX;
Quiero ordenarlos en función del campo de valor primero y luego en función de dateValue descendente dentro de cada "grupo" de campos de "valor".
Lo que he estado haciendo hasta ahora es:
List<X> sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(dateValueSortFunction).reverse().sortedCopy(lotsOfX));
sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(stringValueSortFunction).sortedCopy(sortedList));
Las funciones se definen como:
public class DateValueSortFunction<X> implements Function<X, Long> {
@Override
public Long apply(X input) {
return input.getDateValue().getTime(); //returns millis time
}
}
Y:
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;
}
}
Salida esperada ensortedList
es:
Something 03/18/2013
Something 03/17/2013
Something else 03/20/2013
Something else 03/19/2013
....
Mi enfoque funciona, pero obviamente es ineficiente para atravesar la lista dos veces. ¿Hay una mejor manera de hacer esto?
Estoy usando esto en una aplicación GWT. Implementar comparable no es una opción.