为什么我的对象不能实现Comparable排序?

时间:2013-05-27 15:39:03

标签: 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 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 + " ");
        }

    }

}

为什么会这样?

好吧,在我的问题(不是关于水果)中,我的对象永远不会成对,这就是为什么我认为一个对象比另一个更大或更小。那么当我知道0(对象相等)永远不会发生时,我怎么能处理这种情况呢?

5 个答案:

答案 0 :(得分:7)

compareTo必须返回3个值中的一个:

  • >0 - &gt;大于

  • 0 - &gt;等于

  • <0 - &gt;小于

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

答案 1 :(得分:4)

使用类public static int compare(int x, int y)中的方法java.lang.Integer(自Java 7开始)。

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}

答案 2 :(得分:3)

如果weight永远不会消极,那么您可以尝试

return weight - f.weight; 

而不是

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

从最低到最高值排序。

答案 3 :(得分:2)

最好的方法是使用JDK提供的方法来比较int值,这也清楚地表明代码正在做什么

public int compareTo(Fruit f) {
    return Integer.compare(weight, f.weight);
}

在版本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
}

我的偏好是减法,因为一旦你理解了它,从那时起就很清楚了。

答案 4 :(得分:0)

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

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