同等のものを実装できないクラスがありますが、2つのフィールドに基づいてソートする必要があります。どうすればGuavaでこれを達成できますか?
クラスが次のようになっているとしましょう。
class X {
String stringValue;
java.util.Date dateValue;
}
そして、私はこれらのリストを持っています:
List<X> lotsOfX;
最初に値フィールドに基づいて並べ替え、次に「値」フィールドの各「グループ」内で降順のdateValueに基づいて並べ替えます。
私がこれまでやってきたことは:
List<X> sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(dateValueSortFunction).reverse().sortedCopy(lotsOfX));
sortedList = ImmutableList.copyOf(Ordering.natural().onResultOf(stringValueSortFunction).sortedCopy(sortedList));
関数は次のように定義されます。
public class DateValueSortFunction<X> implements Function<X, Long> {
@Override
public Long apply(X input) {
return input.getDateValue().getTime(); //returns millis time
}
}
と:
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;
}
}
で期待される出力sortedList
は次のとおりです。
Something 03/18/2013
Something 03/17/2013
Something else 03/20/2013
Something else 03/19/2013
....
私のアプローチは機能しますが、リストを2回トラバースするには明らかに非効率的です。これを行うためのより良い方法はありますか?
これをGWTアプリで使用しています。同等のものを実装することはオプションではありません。