我知道这似乎是一个微不足道的问题(我毫不怀疑所有的聪明人都会把它标记为重复),但我找不到任何对我的问题有充分的解释。理解这个简单的主题只是让我变得那么麻烦吗?
我了解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;
它将按降序排列?
答案 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
方法。