如何在实施' Comparable'?时定义排序顺序?

时间:2016-06-28 07:32:20

标签: java sorting comparable

我知道这似乎是一个微不足道的问题(我毫不怀疑所有的聪明人都会把它标记为重复),但我找不到任何对我的问题有充分的解释。理解这个简单的主题只是让我变得那么麻烦吗?

我了解Comparable界面背后的基础知识及其工作原理,但我确实难以找到 HOW 来确定排序的 ORDER

例如 - 我有一个非常简单的Fruit类:

public class Fruit implements Comparable<Fruit> {
private String fruitName;
private String fruitDesc;
private int quantity;

public Fruit(String fruitName, String fruitDesc, int quantity) {
    this.fruitName = fruitName;
    this.fruitDesc = fruitDesc;
    this.quantity = quantity;
}

public String getFruitName() {
    return fruitName;
}
public void setFruitName(String fruitName) {
    this.fruitName = fruitName;
}
public String getFruitDesc() {
    return fruitDesc;
}
public void setFruitDesc(String fruitDesc) {
    this.fruitDesc = fruitDesc;
}
public int getQuantity() {
    return quantity;
}
public void setQuantity(int quantity) {
    this.quantity = quantity;
}

public int compareTo(Fruit compareFruit) {
    //ascending order
    return this.quantity - ((Fruit) compareFruit).getQuantity();
}

为什么在声明上面的compareTo时,它会按升序排序,并在声明相反的时候:

return ((Fruit) compareFruit).getQuantity() - this.quantity;

它将按降序排列?

5 个答案:

答案 0 :(得分:2)

来自Javadoc

  

将此对象与指定的订单对象进行比较。返回一个   负整数,零或正整数,因为此对象较少   比,等于或大于指定的对象。实施者   必须确保所有x和s的sgn(x.compareTo(y))== -sgn(y.compareTo(x))   年。 (这意味着x.compareTo(y)必须抛出异常iff   y.compareTo(x)抛出异常。)

     

实现者还必须确保关系是可传递的:   (x.compareTo(y)&gt; 0&amp; y.compareTo(z)&gt; 0)表示x.compareTo(z)&gt; 0.

     

最后,实现者必须确保x.compareTo(y)== 0暗示   对于所有z,sgn(x.compareTo(z))== sgn(y.compareTo(z))。

     

强烈建议,但并非严格要求   (x.compareTo(y)== 0)==(x.equals(y))。一般来说,任何课程   实现Comparable接口并违反此条件   应该清楚地表明这一事实。推荐的语言为&#34;注意:   这个类的自然顺序与equals不一致。&#34;

     

在前面的描述中,符号sgn(表达式)表示   数学符号函数,定义为返回其中之一   -1,0或1根据表达式的值是负数,零还是正数。

答案 1 :(得分:1)

sort方法按其定义按升序排序。

  

按照升序对指定列表按升序排序   其元素的自然排序。

compareTo方法在您的第一个示例中是正确的,在第二个示例中是错误的,根据:

  

将此对象与指定的订单对象进行比较。返回一个   负整数,零或正整数,因为此对象较少   比,等于或大于指定的对象。

答案 2 :(得分:0)

据我所知,如果方法返回负值(值小于0),则第一个对象位于排序列表中的第二个对象之前。如果它返回正值(值大于0),则第一个对象位于排序列表中的第二个对象之后。如果它返回0,则两个对象都相等。

第一个对象是指示例中this关键字引用的对象,第二个对象是指传递给compareTo方法的对象。

答案 3 :(得分:0)

来自Java API:

  

将此对象与指定的订单对象进行比较。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

链接:https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

compareTo()方法返回一个整数,告诉分类器实例之间的相对位置,这样if (a.compareTo(b) > 0),然后a被认为是#34;更大&#34;,因此应该出现在b之后的排序列表中。同样地if (a.compareTo(b) < 0)然后a被视为&#34;更小&#34;。

因此,如果您想要升序,则应在compareTo()之前坚持引用this的{​​{1}}实施,即compareObject

简而言之: this.value - compareObject.value;基本上意味着&#34; a大于b&#34;。同样地,a.compareTo(b) > 0表示&#34; a小于b&#34;。

答案 4 :(得分:0)

compareTo方法确定排序操作的顺序(升序与降序)。

定义排序操作的代码确定顺序。排序操作重复调用compareTo,对于正在排序的集合中的每个对象至少调用一次。排序操作的其余代码如何跟踪调用compareTo代码的结果,以确定结果是升序还是降序。

例如,Collections.sort排序操作始终按升序排序。该库中的代码将调用每个对象的compateTo方法。