私は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メソッドがゼロ以外の結果を返すと中断します。
きちんとした方法はありますか?