我使用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
方法返回非零结果时断开。
有更简洁的方法吗?
答案 0 :(得分:3)
番石榴贡献者。
你的解决方案看起来几乎和你要的一样好,但是你应该做更高效的
,而不是做一个排序的副本并拉出前两个元素。List<E> best2 = ranker.greatestOf(list, 2);
然后,实际上,迭代通过比较器,虽然你可以重构,所以你重用Ordering.compound
的比较器列表,而不是重新创建它。