使用可比接口进行对象分类

时间:2019-02-16 19:32:49

标签: java

我有一个具有4个int字段的类。我想通过对字段的一些数学运算来对对象数组进行排序。我尝试了以下代码,但未发生排序。

class Cust1 implements Comparable<Cust1>{

    int a;
    int o;
    int s;
    int p;
    @Override
    public int compareTo(Cust1 b) {
        if(this.a + this.s <= b.a + b.s)
        {
            return 1;
        }
        else {
            return 0;
        }
    }   
}

public class Test5 {

    public static void main (String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        Cust1[] cust = new Cust1[n];
        for(int i=0;i<n ;i++)
        {
            Cust1 a = new Cust1();
            String[] str = br.readLine().split(" "); 
            a.a = Integer.parseInt(str[0]);
            a.o = Integer.parseInt(str[1]);
            a.s = Integer.parseInt(str[2]);
            a.p = Integer.parseInt(str[3]);
            cust[i] =a;
        }
        Arrays.sort(cust, new Comparator<Cust1>() {
                @Override
                public int compare(Cust1 o1, Cust1 o2) {
                    return o1.compareTo(o2);
                }
        });
    }
}

2 个答案:

答案 0 :(得分:1)

根据您的代码段:您不需要提供Comparator,因为Cust1已经实现了Comparable。因此,这应该足够了:

Arrays.sort(cust);

此外,Cust1的{​​{1}}实现并不能真正告诉一个对象Comparable何时是另一个对象。可能,您的意思是这样的:

is less then

但是很难说, @Override public int compareTo(Cust1 b) { if(this.a + this.s < b.a + b.s) { return 1; } else if (this.a + this.s > b.a + b.s) { return -1; } else { return 0; } } 的确切实现应该没有更多细节(例如,由于某些原因,Comparableo字段根本没有参与比较)

答案 1 :(得分:0)

您的比较器工作错误。它应该返回:

  • > 0 -当前对象比另一个对象大
  • 0 -当前对象与另一个对象相等
  • <0 -当前对象比另一个对象

    Cust1类实现了可比的{

    int a;
    int o;
    int s;
    int p;
    
    @Override
    public int compareTo(Cust1 b) {
        return Integer.compare(a + s, b.a + b.s);
    }
    

    }

并且您不必为Arrays.sort()提供额外的比较器,因为Cust1已经实现了Comparable