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

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

有没有更简洁的方法?

4

1 回答 1

3

番石榴贡献者在这里。

您的解决方案似乎几乎与您将要获得的一样好,但与其进行排序复制并提取前两个元素,您应该更高效

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

然后,确实,遍历比较器,尽管您可能可以重构,以便重用来自 的比较器列表Ordering.compound,而不是重新创建它。

于 2012-06-27T13:06:54.890 回答