Java 为什么不';我的对象实现了可比较的排序吗?

Java 为什么不';我的对象实现了可比较的排序吗?,java,sorting,Java,Sorting,我的简单示例(编译的工作代码)只是不按水果的重量排序 import java.util.Arrays; public class Test { public static class Fruit implements Comparable<Fruit> { public int weight = 0; public Fruit(int w) { weight = w; } // compare this fruit to a

我的简单示例(编译的工作代码)只是不按水果的重量排序

import java.util.Arrays;

public class Test {

    public static class Fruit implements Comparable<Fruit> {
        public int weight = 0;
        public Fruit(int w) { weight = w; }
        // compare this fruit to a given fruit f
        public int compareTo(Fruit f) {
            return (weight > f.weight) ? 1 : 0;
        }
    }

    public static void main(String[] args) {

        // get some fruits (we intentionally create a box for 100 fruits)
        Fruit[] fruits = new Fruit[100];
        for (int i = 0; i < 10; i++) {
            fruits[i] = new Fruit((int)(Math.random() * 50 + 1));
        }

        // sort fruits by weight
        Arrays.sort(fruits, 0, 10);

        // print fruit weights
        for (int i = 0; i < 10; i++) {
            System.out.print(fruits[i].weight + " ");
        }

    }

}
导入java.util.array;
公开课考试{
公共静态类{
公共整数权重=0;
公共水果(intw){重量=w;}
//将此水果与给定的水果f进行比较
公共内部比较(水果f){
返回(重量>f.重量)?1:0;
}
}
公共静态void main(字符串[]args){
//买一些水果(我们特意为100个水果制作了一个盒子)
水果[]水果=新水果[100];
对于(int i=0;i<10;i++){
水果[i]=新水果((int)(Math.random()*50+1));
}
//按重量分类水果
数组。排序(0,10);
//打印水果重量
对于(int i=0;i<10;i++){
System.out.print(水果[i].重量+“”);
}
}
}
为什么会这样


好的,在我的问题中(不是关于水果),我有一些对象,它们从来都不是成对相等的,这就是为什么我认为一个对象比另一个对象大或小的原因。那么,当我知道0(对象相等)永远不会发生时,我如何处理这种情况呢?

您的
compareTo
方法应该返回-1,0,1

LESSER = -1;
EQUAL = 0;
BIGGER = 1;

compareTo
必须返回以下三个值之一:

  • >0
    -->大于

  • 0
    -->相等

  • 小于


您的
compareTo
方法仅返回
0
1
;解决这个问题。

如果
重量
从来都不是负数,那么你可以试试

return weight - f.weight; 
而不是

return (weight > f.weight) ? 1 : 0;

从最低值到最高值排序。

使用类
java.lang.Integer
中的方法
公共静态int比较(int x,int y)
(自java 7以来)


最好的方法是使用JDK提供的方法来比较
int
值,这也使代码的作用非常清楚

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}
在java版本7之前,您有两种选择:

public int compareTo(Fruit f) {
    return weight - f.weight; // terse, but slightly obtuse
}

public int compareTo(Fruit f) {
    return new Integer(weight).compareTo(f.weight); // ugly, but supposedly clear
}

我更喜欢减法,因为一旦你理解了它,从那以后就很清楚了。

什么比什么大?我完全没有注意到。1-->此对象比作为参数传递的对象大(或者比作为参数传递的对象大)。如果正确实现了compareTo操作(请参见下面的答案),并且根据定义,两个值永远不会相等,compareTo将永远不会返回0-无需专门处理不会发生的事情。如果——出于某些原因——它确实在一段时间后发生,您的假设将是错误的,但实现仍然是正确的(如果compareTo则返回0)。没有造成伤害,对吧?我喜欢你的解决方案,因为
返回权重-f.weight
比Integer的
返回(权重。你知道吗,在我的项目中,水果永远都是不相等的,我如何利用这个事实来防止返回
0
?@SophieSperner如果水果的重量总是
=0
,并且所有的重量都不同,那么你
重量-f.weight
将永远不会返回0。但在你的例子中,水果可以有相同的重量,所以我不确定如何回答你的评论。@assylias True,但我相信我们可以假设重量不能是负数,所以对于正数
weight-f.weight
就可以了。在其他情况下,
Integer.compare(权重,f.weight)将是最好的选择。@Pshemo在水果的上下文中,是的,我想。但这会导致厚脸皮的错误,所以我总是有点不愿意使用这种方法。@assylias是的,如果数字也可能是负数,我的答案就不正确了。我更新了我的答案,以防止将来的读者使用它。没有
整数。比较
不是最好的,因为嵌套调用比较是垃圾,尤其是比较整数。@SophieSperner说你。。。java将通过JIT将其与减法连成一行。这是最清晰的代码,这非常重要。@SophieSperner如果您熟悉该模式,这一点是很清楚的,但如果您不熟悉,则可能会让新手感到困惑。清晰是非常重要的。另外,如果您是反向排序,
f.weight-weight
是外观非常相似的代码,但
-Integer.compare(weight,f.weight)
更清晰。当所有数字都预期为正和/或小时,减法效果很好。但是
-3-Integer.MAX_VALUE
将错误地返回一个正数,例如。@assylias不是防御性的,但是。。。你的评论是让教条代替你的大脑:a)权重不能是负的,B)如果期望的值范围甚至在max
int
的几个数量级之内,你会使用
long
,因此在这种情况下,简单的减法是完全可以接受的。您知道:)您必须始终记住代码所在的位置,以便应用最简单的安全解决方案。
public int compareTo(Fruit f) {
    return weight - f.weight; // terse, but slightly obtuse
}

public int compareTo(Fruit f) {
    return new Integer(weight).compareTo(f.weight); // ugly, but supposedly clear
}