Multi critérios de classificação de uma lista de objetos com pedidos de goiaba

Eu tenho uma classe que não pode ser comparada, mas precisa ser classificada com base em dois campos. Como posso conseguir isso com o Guava?

Vamos dizer que a aula é:

class X {
  String stringValue;
  java.util.Date dateValue;
} 

E eu tenho uma lista destes:

List<X> lotsOfX;

Quero classificá-los com base no campo de valor primeiro e, em seguida, com base em dateValue que desce dentro de cada campo 'group' de 'value'.

O que tenho feito até agora é:

List<X> sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(dateValueSortFunction).reverse().sortedCopy(lotsOfX));
sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(stringValueSortFunction).sortedCopy(sortedList));

As funções são definidas como:

public class DateValueSortFunction<X> implements Function<X, Long> {

    @Override
      public Long apply(X input) {
        return input.getDateValue().getTime();  //returns millis time
      }
}

E:

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;
        }
}

Saída esperada emsortedList é:

Something   03/18/2013
Something   03/17/2013
Something else  03/20/2013
Something else  03/19/2013
....

Minha abordagem funciona, mas é obviamente ineficiente para percorrer a lista duas vezes. Existe um jeito melhor de fazer isso?

Eu estou usando isso em um aplicativo GWT. Implementar comparável não é uma opção.

questionAnswers(3)

yourAnswerToTheQuestion