可比较的比较Java

时间:2011-09-21 14:53:32

标签: java comparator comparable

这是我的代码

class ComparableTest
{
    public static void main(String[] args)
    {
        BOX[] box = new BOX[5];
        box[0] = new BOX(10,8,6); 
        box[1] = new BOX(5,10,5);
        box[2] = new BOX(8,8,8);
        box[3] = new BOX(10,20,30);
        box[4] = new BOX(1,2,3);
        Arrays.sort(box);
        for(int i=0;i<box.length;i++)
            System.out.println(box[i]);
    }
}

我还有一个实现Comparable的类BOX。 现在我有几个问题,我希望大家帮助我。

1.在可比较的界面,系统定义中声明的方法,如同我可以在可比较的方法中使用任何方法,或者它只能是compareTo吗?

2.我没有提供Arrays.sort方法的实现,那么它如何对我的元素进行排序呢?

3.当我使用Comparator代替comparable时,我会使用:

class comparatorTest
{
    public static void main(String args[])
    {
        Student[] students = new Student[5];
        Student[0] = new Student(“John”,”2000A1Ps234”,23,”Pilani”);
        Student[1] = new Student(“Meera”,”2001A1Ps234”,23,”Pilani”);
        Student[2] = new Student(“Kamal”,”2001A1Ps344”,23,”Pilani”);
        Student[3] = new Student(“Ram”,”2000A2Ps644”,23,”Pilani”);
        Student[4] = new Student(“Sham”,”2000A7Ps543”,23,”Pilani”);    
        // Sort By Name
        Comparator c1 = new studentbyname();
        Arrays.sort(students,c1);
        for(int i=0;i<students.length;i++)
            System.out.println(students[i]);
    }
}

//在上面的代码studentbyname implements comparator中,但是框stil实现了comparable .i.e

class studentbyname implements comparator
{
    public int compare(Object o1,Object o2)
    {  
        Student s1 = (Student) o1;
        Student s2 = (Student) o2;
        return s1.getName().compareTo(s2.getName());
    }
}

现在我在做Arrays.sort(students,c1),为什么我现在通过c1?

3 个答案:

答案 0 :(得分:3)

  1. 要符合可比较合约,您必须至少拥有 compareTo 方法。您可以在课程中使用尽可能多的添加方法。

  2. 它根据可比较界面对自然顺序中的元素进行排序。所以 sort 在元素之间调用 compareTo ,以查看放置它们的顺序。

  3. 为排序方法提供比较器允许排序订购(a)未实施可比较的元素或(b)您希望以除了班级可比较实施所定义的“自然顺序”之外的其他顺序订购它们。

  4. 当您将Comparator传递给sort时,它会调用Comparator的compare方法而不是元素的compareTo方法(如果已实现)。

    请参阅What is an interface

    请参阅Comparator

    请参阅Comparable

答案 1 :(得分:1)

  1. 只要您实施Comparable,就可以在compareTo中定义任意数量的方法。此方法可用于检查类以进行比较的许多情况。例如,将实例插入到有序TreeSet中时。 compareTo为该类的所有实例提供了一般订购规则。
  2. Arrays.sort在其元素的自然顺序中对数组进行排序。也就是说,使用compareTo
  3. 您可以使用Comparator来定义自定义排序规则。就像你有一张桌子一样,你可以按任何一个列进行排序。您可以为其每个列定义Comparator,并且您仍然可以在类“compareTo中定义一个类固有排序规则(与Class所代表的现实相关)。” LI>

答案 2 :(得分:0)

实施Comparable使您有义务为compareTo()提供实施。

传递给Arrays.sort(Object[])方法的Object数组中的所有元素都必须实现Comparable。如果您想使用Comparator,则必须使用Arrays.sort()方法,该方法将Comparator作为参数。您在上面的示例中使用的方法将Comparator作为第二个参数 - 因此需要在方法调用中提供c1