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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta