如何在番石榴订购中找到哪个比较器“打破了平局”

时间:2012-06-27 12:50:22

标签: java guava comparator

我使用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

我有一个可行的解决方案,但它不是特别优雅,并且意味着重复Comparator的列表。它是使用Ordering提供排序列表(Ordering.sortedCopy),拉出前两个元素(当然是范围检查),迭代相同Comparator的列表,比较这两个元素,在compareTo方法返回非零结果时断开。

有更简洁的方法吗?

1 个答案:

答案 0 :(得分:3)

番石榴贡献者。

你的解决方案看起来几乎和你要的一样好,但是你应该做更高效的

,而不是做一个排序的副本并拉出前两个元素。
List<E> best2 = ranker.greatestOf(list, 2);

然后,实际上,迭代通过比较器,虽然你可以重构,所以你重用Ordering.compound的比较器列表,而不是重新创建它。