Java 如何找到哪个比较器';打破了领带';点番石榴

Java 如何找到哪个比较器';打破了领带';点番石榴,java,guava,comparator,Java,Guava,Comparator,我使用Guava的排序类进行排序,从给定列表中选择“最佳”。它看起来像这样: // 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

我使用Guava的
排序
类进行排序,从给定列表中选择“最佳”。它看起来像这样:

// 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 ranker=Ordering.component(不可变列表(
字符串长度,
大写字母的百分比,
(元音的数量);
//使用排序从字符串列表中查找“最佳”
字符串best=ranker.max(asList(“foo”、“fooz”、“Bar”、“AEro”);
通过这种排序方式,字符串“AEro”是最好的,因为它是最长的,与“fooz”结合得最好,但分界符的大写字符比例更高

我正在寻找一种方法来判断哪个
比较器
“打破了僵局”,在这个愚蠢的做作的例子中,哪个是比较器
百分比(大写)

我有一个可行的解决方案,但它不是特别优雅,它意味着复制
Comparator
s的列表。它是使用
排序
提供一个排序列表(
排序.sortedCopy
),提取前两个元素(当然是范围检查),遍历相同的
比较器
的列表,比较这两个元素,当
compareTo
方法返回非零结果时中断


有没有更整洁的方法?

这里有番石榴

您的解决方案似乎与您将要得到的几乎一样好,但是您不应该进行排序拷贝并提取前两个元素,而应该更高效地执行

List<E> best2 = ranker.greatestOf(list, 2);
List best2=ranker.greatestOf(List,2);
然后,确实,遍历比较器,尽管您可能可以重构,以便重用排序.component中的比较器列表,而不是重新创建它