4

私はGuavaのOrderingクラスを使用して並べ替えを実行し、指定されたリストから「最良」を選択します。これは次のようになります。

// Create the Ordering, with a list of Comparators
Ordering<String> ranker = Ordering.compound(ImmutableList.of(
    STRING_LENGTH,
    PERCENTAGE_UPPERCASE,
    NUMBER_OF_VOWELS));

// Use the ordering to find the 'best' from a list of Strings
String best = ranker.max(asList("foo", "fooz", "Bar", "AEro"));

これによりOrdering、文字列「AEro」は最も長く、「fooz」とのジョイントベストであるため最高ですが、大文字の割合が高いタイブレークです。

私は、どのComparator「ネクタイを壊した」かを知る方法を探しています。これは、このばかげた工夫の例では、コンパレータになりPERCENTAGE_UPPERCASEます。

私には実行可能な解決策がありますが、それは特にエレガントではなく、sのリストを複製することを意味しComparatorます。を使用しOrderingて、ソートされたリスト(Ordering.sortedCopy)を提供し、最初の2つの要素をプルし(もちろん範囲チェック)、同じComparatorsのリストを反復処理し、これら2つの要素を比較し、compareToメソッドがゼロ以外の結果を返すと中断します。

きちんとした方法はありますか?

4

1 に答える 1

3

ここでグアバの貢献者。

あなたの解決策は、あなたが得ようとしているものとほぼ同じくらい良いようですが、ソートされたコピーを実行して最初の2つの要素をプルする代わりに、より効率的に実行する必要があります

List<E> best2 = ranker.greatestOf(list, 2);

そして、実際、コンパレータを繰り返し処理しますが、おそらくリファクタリングできるので、コンパレータのリストを再作成するのでOrdering.compoundはなく、から再利用します。

于 2012-06-27T13:06:54.890 に答える