5

我有一个方法,它的Comparator一个参数需要一个。我想传递一个Comparator进行正常比较的反向比较器和一个反向比较器。

java.util.Collections提供了一个reverseOrder()这对反向比较有好处,但我找不到任何正常Comparator的 .

我想到的唯一解决方案是Collections.reverseOrder(Collections.reverseOrder())。但我不喜欢它,因为里面调用了双重方法。

当然我可以这样写NormalComparator

public class NormalComparator<T extends Comparable> implements Comparator<T> {
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}

但我真的很惊讶 Java 没有开箱即用的解决方案。

4

4 回答 4

6

大多数可以指定 a 的地方Comparator也有一个完全不使用 a 的版本Comparator,在这种情况下它使用自然顺序(即它希望所有对象都实现Comparable和使用compareTo)。

因此,通常的解决方案是根本不指定 a Comparator您是否有仅支持该方法的特定情况Comparator

如果您绝对需要它,Google Collections(以及Guava,它是 Google Collections 的超集)提供Ordering.natural()返回一个Ordering对象Comparable,该对象代表接口定义的自然顺序。Orderingimplements Comparator,所以你可以简单地使用它。

于 2010-06-02T10:07:17.397 回答
1

但我真的很惊讶 Java 没有开箱即用的解决方案。

我想它在某些情况下会很有用......就像你的一样。但在大多数用例中,应用程序会直接使用对象的compareTo方法。通过Comparator对象间接没有任何目的......大多数时候。

我的猜测是,那些 Java API 的设计者并没有认为您的用例重要到足以直接支持。此外,您的实现只有四行代码。

Java 类库并不完美。学会忍受它:-)。

于 2010-06-02T10:31:07.823 回答
0

对于反向排序使用Collections.reverseOrder()...

返回一个比较器,它对实现 Comparable 接口的对象集合施加自然顺序的逆向。

于 2010-06-02T10:05:07.827 回答
0

通常不需要自然顺序,因为通常有一个需要. 您始终可以按照设置的示例编写如下内容:Comparator<T>Comparable<T>Collections.reverseOrder()

private static final Comparator<?> NATURAL_ORDER =
   new Comparator<Comparable<Object>>() {
     @Override public int compare(Comparable<Object> o1, Comparable<Object> o2) {
        return o1.compareTo(o2);
     }
   };

@SuppressWarnings("unchecked")
public static <T> Comparator<T> naturalOrder() {
    return (Comparator<T>) NATURAL_ORDER;
}

然后,您可以编写如下内容:

List<String> names = Arrays.asList("Bob", "Alice", "Carol");
Collections.sort(names, naturalOrder());
System.out.println(names);
// prints "[Alice, Bob, Carol]"
于 2010-06-02T10:28:24.690 回答