CompareTo()和compare()比较器的方法和可比较的方法

时间:2016-05-16 17:49:23

标签: java comparator

从下面的代码我不理解两件事:

  1. CompareTo()Compare()方法返回int,但这对排序有何影响?

  2. 该方法返回this.name.compareTo(d.name)this.name中的内容是什么?

  3. 请详细解释。

    import java.util.*;
    
    class Dog implements Comparator<Dog>, Comparable<Dog>{
       private String name;
       private int age;
       Dog(){
       }
    
       Dog(String n, int a){
          name = n;
          age = a;
       }
    
       public String getDogName(){
          return name;
       }
    
       public int getDogAge(){
          return age;
       }
    
       // Overriding the compareTo method
       public int compareTo(Dog d){
          return (this.name).compareTo(d.name);
       }
    
       // Overriding the compare method to sort the age 
       public int compare(Dog d, Dog d1){
          return d.age - d1.age;
       }
    }
    
    public class Example{
    
       public static void main(String args[]){
          // Takes a list o Dog objects
          List<Dog> list = new ArrayList<Dog>();
    
          list.add(new Dog("Shaggy",3));
          list.add(new Dog("Lacy",2));
          list.add(new Dog("Roger",10));
          list.add(new Dog("Tommy",4));
          list.add(new Dog("Tammy",1));
          Collections.sort(list);// Sorts the array list
    
          for(Dog a: list)//printing the sorted list of names
             System.out.print(a.getDogName() + ", ");
    
          // Sorts the array list using comparator
          Collections.sort(list, new Dog());
          System.out.println(" ");
          for(Dog a: list)//printing the sorted list of ages
             System.out.print(a.getDogName() +"  : "+
             a.getDogAge() + ", ");
       }
    } 
    

2 个答案:

答案 0 :(得分:0)

正如您可能猜到的那样, compare compareTo 用于比较两个对象。

工作原理

compare(a, b)比较对象a和b。如果返回的值是&lt; 0,则a低于b。如果为0,则两个对象都相等。如果它优于0,则a大于b。

a.compareTo(b)也会比较对象a和b。返回值的工作方式与compare的工作方式相同。但是,在调用它时你必须小心a不是null,否则抛出NullPointerException。

何时使用

如果您的班级只需要一个比较方案,那么只使用compareTo就好了。

但是,如果您需要以多种方式对Dog进行排序,例如,您希望按年龄对其进行排序,而按名称对其他时间进行排序,这就是Comparator变得方便的地方。您可以创建两个Comparator<Dog>,一个按年龄排序,另一个按名称排序。在调用sort之类的方法时,您需要提供要使用的比较器作为参数,以获得所需的排序。

相对于您的问题

关键字this指的是当前的Dog实例。因此,this.name是当前Dog实例的名称。

答案 1 :(得分:0)

CompareTo()用于定义对象的“自然顺序”,并创建一个int来确定哪个对象比另一个更“大”并实现Comparable。

a.compareTo(b)<0    //same as a<b     
a.compareTo(b)>0    //same as a>b
a.compareTo(b)==0   //same as a==b
a.compareTo(b)!=0   //same as a!=b
a.compareTo(b)<=0   //same as a<=b
a.compareTo(b)>=0   //same as a>=b

至于它的排序方式与compare()不同,完全取决于你如何实现compareTo()。

下面举例说明假设phoneNumber有3个字段: areaCode 前缀 lineNumber

    public  int compareTo(PhoneNumber pn){  
                //  Compare area codes  
            if  (areaCode< pn.areaCode) {   
                return -1;  
            }   
            if  (areaCode > pn.areaCode){   
                    return 1;   
            }   
            //  Area codes are equal, compare prefixes  
            if  (prefix < pn.prefix){   
                    return -1;  
            }   
            if  (prefix > pn.prefix){   
                    return 1;   
            }   
            //  Area codes and prefixes are equal, compare line numbers 
            if  (lineNumber < pn.lineNumber){   
                    return -1;  
            }   
            if  (lineNumber > pn.lineNumber){   
                    return  1;  
            }   
            return  0;  //  All fields  are equal   
            }   

compare()接受两个对象并比较它们的字段之间的值,并实现Comparator

compare(a,b)<0    //same as a<b     
compare(a,b)>0    //same as a>b
compare(a,b)==0   //same as a==b
compare(a,b)!=0   //same as a!=b
compare(a,b)<=0   //same as a<=b
compare(a,b)>=0   //same as a>=b

this回答对比较器和可比较的问题有更详尽和清晰的解释。