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
(并且他们将比较器粘贴到方法,而不是创建一个新的自然比较器
),因此不是真正的干解决方案。我想。。。