Java中现成的直接比较器

Java中现成的直接比较器,java,collections,guava,comparator,comparable,Java,Collections,Guava,Comparator,Comparable,我有一个方法,它需要一个比较器作为它的一个参数。我想传递一个进行正常比较的比较器,以及一个进行反向比较的反向比较器 java.util.Collections提供了一个reverseOrder()这对于反向比较很好,但是我找不到任何正常的比较器 我想到的唯一解决方案是Collections.reverseOrder(Collections.reverseOrder())。但是我不喜欢它,因为double方法在内部调用 当然,我可以像这样编写NormalComparator: public cla

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

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

我想到的唯一解决方案是
Collections.reverseOrder(Collections.reverseOrder())
。但是我不喜欢它,因为double方法在内部调用

当然,我可以像这样编写
NormalComparator

public class NormalComparator<T extends Comparable> implements Comparator<T> {
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}
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;
}
公共类NormalComparator实现Comparator{
公共整数比较(tO1,tO2){
返回o1。与(o2)相比;
}
}

但是我真的很惊讶,Java没有现成的解决方案。

对于反向排序,请使用
集合。reverseOrder()

返回一个比较器,该比较器对 实现可比较接口的对象集合


大多数可以指定
比较器的地方也有一个版本根本不使用
比较器
,在这种情况下,它使用自然顺序(即,它希望所有对象都实现
可比
,并使用
比较器

因此,通常的解决方案是根本不指定
比较器。您是否有只支持
比较器方法的特定案例

如果您确实需要它,则(以及,它是Google集合的超集)提供了表示自然顺序的返回,如
Compariable
接口所定义<代码>排序
实现了
比较器
,因此您可以简单地使用它。

通常不需要自然顺序
比较器
,因为通常会有一个重载,它需要一个
可比的
。您可以始终遵循Collections.reverseOrder()设置的示例,编写如下内容:

public class NormalComparator<T extends Comparable> implements Comparator<T> {
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}
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;
}
私有静态最终比较器自然顺序=
新比较器(){
@覆盖公共整数比较(可比o1,可比o2){
返回o1。与(o2)相比;
}
};
@抑制警告(“未选中”)
公共静态比较器naturalOrder(){
返回(比较器)自然顺序;
}
然后,您可以编写如下内容:

List<String> names = Arrays.asList("Bob", "Alice", "Carol");
Collections.sort(names, naturalOrder());
System.out.println(names);
// prints "[Alice, Bob, Carol]"
List name=Arrays.asList(“Bob”、“Alice”、“Carol”);
Collections.sort(name,naturalOrder());
System.out.println(名称);
//打印“[Alice,Bob,Carol]”
但我真的很惊讶Java没有现成的解决方案

我想它在一些情况下是有用的。。。就像你的一样。但在大多数用例中,应用程序只需直接使用对象的
compareTo
方法。通过
比较器
对象间接定向将毫无用处。。。大多数时候

我猜这些java API的设计者没有考虑到你的用例足够重要,直接支持。此外,您的实现只有四行代码


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

你不理解这个问题。我也想要一个直接的,而不仅仅是反向的。双反转可能是normal@István:对于自然排序,为可比较对象实现简单的自然比较器。我在标准库中找不到。它在OP中,你也可以see@Istv安:是的,我知道,不幸的是,恐怕没有比这个更好的答案了:-(这是我的方法,所以它没有自然的顺序。(实际上它有,因为我写它是为了工作,但我不想,我在寻找更好的解决方案)是的,我写它是因为我查看了
HashTree
@KARASZI的源代码:你在说哪个
HashTree
?Java SE中没有这样的类。你是说
TreeMap
?对不起,是的,我是说
TreeMap
!:)
Ordering.natural()当使用
函数组成比较器时,
实际上是一个很好的起点(
Ordering.onResultOf(..)
),因为通常每个比较都归结为比较
字符串
数字
。。。所有这些都实现了
可比性
。正如您在OP中看到的,这就是我所做的!他们在每个需要
比较器的方法中都接受
null
(并且他们将
比较器粘贴到
方法,而不是创建一个新的
自然比较器
),因此不是真正的干解决方案。我想。。。