2011-09-21 83 views
1

这里是我的代码可比比较的Java

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]); 
    } 
} 

而且我有一个类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,但还是老样子盒实现comparable .IE

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?

+2

您对Java中的多态性,继承和方法重载工作没有基本知识。先看看这些,然后你就会明白为什么:你需要实现compareTo,你可以传递不同数量的参数给似乎是相同的方法。 –

+0

你可以参考http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html – lkamal

回答

3
  1. 为了满足可比合同,你必须有至少的compareTo方法。你可以在你的班级中添加尽可能多的添加方法。

  2. 它在排序基于可比接口上自然顺序的元素。所以排序正在调用比较到之间的元素,看看在哪个顺序放置它们。

  3. 提供比较的排序方法允许排序订购元素,要么(一)不执行可比或(b)如果您想订购他们在其他一些级别比“自然秩序“,由该类的定义类比执行。

当您传递比较器进行排序时,它会调用比较器的比较方法而不是元素的compareTo方法(如果已实施)。

看到What is an interface

看到Comparator

看到Comparable

+0

所以Comparable就像,我不知道什么是正确的词,但'系统定义'也就是说,它必须包含compareTo的权利? – Kraken

+1

Comparable是一个**接口**,这意味着它定义了一组必须由声称实现该接口的类实现的方法集。 –

+0

当我将'c'和要排序的数组一起传递时会发生什么? – Kraken

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