可能重复:
compare()和compareTo()
之间的区别Java:实现Comparable和Comparator有什么区别?
Comparable和Comparator之间的关键区别是什么?
哪些情况比哪一种更受欢迎?
谢谢
更新 - 良好的链接与示例!
http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html
我见过同时实现Comparable和Comparator的类.这是什么意思?为什么我会使用一个而不是另一个?
有谁知道为什么 java.lang.Number不实施Comparable?这意味着你无法排序Numbers的Collections.sort这对我来说有点陌生.
发布讨论更新:
java.lang.Number未实现Comparable的原因的最简单解释源于可变性问题.
对于位的检讨,java.lang.Number是抽象的超类型的AtomicInteger,AtomicLong,BigDecimal,BigInteger,Byte,Double,Float,Integer,Long和Short.在那个列表上,AtomicInteger并AtomicLong没有实现Comparable.
四处搜索,我发现Comparable在可变类型上实现这不是一个好习惯,因为对象在比较期间或之后可能会发生变化,因此比较结果无用.这两个AtomicLong和AtomicInteger是可变的.API设计者已经预见到没有Number实现,Comparable因为它会限制未来子类型的实现.确实,AtomicLong并且AtomicInteger在java.lang.Number最初实现之后很久就被添加到Java 1.5中.
除了可变性之外,这里也可能有其他考虑因素.一compareTo实施Number就必须促进所有的数字值BigDecimal,因为它是能够容纳所有的Number子类型.这种促销在数学和表现方面的含义对我来说有点不清楚,但我的直觉发现了解决方案.
我有一个对象列表,我需要在一个字段上排序,比如分数.在没有多想的情况下,我编写了一个实现Comparator的新类,它可以执行任务并且可以正常运行.
现在回过头来看,我想知道我是否应该让我的类实现Comparable,而不是创建一个实现Comparator的新类.分数是对象将被订购的唯一字段.
我做过什么可以接受的做法?
是正确的方法"首先让类实现Comparable(对于自然顺序),如果需要替代字段比较,那么创建一个实现Comparator的新类"?
如果上面的(2)为真,那么它是否意味着只有在具有类实现Comparable之后才应该实现Comparator?(假设我拥有原始课程).
我不确定如何在我的抽象类中实现类似的接口.我有以下示例代码,我正在尝试并解决它:
public class Animal{
public String name;
public int yearDiscovered;
public String population;
public Animal(String name, int yearDiscovered, String population){
this.name = name;
this.yearDiscovered = yearDiscovered;
this.population = population; }
public String toString(){
String s = "Animal name: "+ name+"\nYear Discovered: "+yearDiscovered+"\nPopulation: "+population;
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个测试类,它将创建Animal类型的对象,但是我希望在这个类中有一个类似的接口,以便旧年的发现排名高于低.我不知道如何解决这个问题.
Java中的枚举实现了Comparable接口.这本来是很好的覆盖Comparable的compareTo方法,但在这里它被标记为最终.Enum's 的默认自然顺序compareTo是列出的顺序.
有谁知道为什么Java枚举有这个限制?
假设我有一个class Foo(val a: String, val b: Int, val c: Date),我想Foo根据所有三个属性对s 列表进行排序.我该怎么做?
是什么返回的区别0,返回1和返回-1在compareTo()Java中?
我想比较两种类型的变量T extends Number.现在我想知道这两个变量中哪一个大于另一个或相等.不幸的是我还不知道确切的类型,我只知道它将是一个子类型java.lang.Number.我怎样才能做到这一点?
编辑:我试图用另一种解决方法TreeSets,这实际上自然排序工作(当然它的工作原理,所有的子类Number实现Comparable除的AtomicInteger和AtomicLong的).因此,我将丢失重复值.使用Lists时,Collection.sort()由于绑定不匹配,不接受我的列表.非常不满意.
我需要一个比较器作为策略模式的一部分,可以使用对象的自然顺序或一些自定义顺序.对于自然排序的情况,我写了一个简单的比较器:
private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但我想知道是否有人知道标准API中的一个.我查看了TreeMap,它没有这样的类,所以当编写代码时,明显的答案是否定的,但也许稍后会添加.
comparable ×10
java ×9
comparator ×4
compareto ×1
enums ×1
generics ×1
kotlin ×1
numbers ×1
sorting ×1