Java comparator和comparable的CompareTo()和compare()方法

Java comparator和comparable的CompareTo()和compare()方法,java,comparator,Java,Comparator,从下面的代码中,我不理解两件事: CompareTo()和Compare()方法返回int,但这会如何影响排序 该方法返回this.name.compareTo(d.name)。此.名称中有什么内容 请详细解释 import java.util.*; class Dog implements Comparator<Dog>, Comparable<Dog>{ private String name; private int age; Dog(){

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

  • CompareTo()
    Compare()
    方法返回
    int
    ,但这会如何影响排序

  • 该方法返回
    this.name.compareTo(d.name)
    此.名称中有什么内容

  • 请详细解释

    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() + ", ");
       }
    } 
    
    import java.util.*;
    类狗实现比较器,可比较{
    私有字符串名称;
    私人互联网;
    狗(){
    }
    狗(字符串n,整数a){
    name=n;
    年龄=a;
    }
    公共字符串getDogName(){
    返回名称;
    }
    public int getDogAge(){
    回归年龄;
    }
    //重写compareTo方法
    公共内部比较(狗d){
    return(this.name).compareTo(d.name);
    }
    //重写compare方法以对年龄进行排序
    公共整数比较(狗d、狗d1){
    返回d.age-d1.age;
    }
    }
    公开课范例{
    公共静态void main(字符串参数[]){
    //获取狗对象的列表
    列表=新的ArrayList();
    添加(新狗(“毛茸茸的”,3));
    添加(新狗(“花边”,2));
    添加(新狗(“罗杰”,10));
    添加(新狗(“汤米”,4));
    添加(新狗(“Tammy”,1));
    Collections.sort(list);//对数组列表进行排序
    for(Dog a:list)//打印已排序的名称列表
    System.out.print(a.getDogName()+“,”);
    //使用比较器对数组列表排序
    Collections.sort(list,newdog());
    System.out.println(“”);
    for(Dog a:list)//打印已排序的年龄列表
    System.out.print(a.getDogName()+“:”+
    a、 GetDoAge()+“,”;
    }
    } 
    
    正如您可能猜到的,compare和compareTo用于比较两个对象

    它的工作原理

    比较(a,b)
    比较对象a和b。如果返回值小于0,则a低于b。如果为0,则两个对象相等。如果大于0,则a大于b

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

    何时使用它

    如果您的类只需要一个比较方案,那么只使用
    compareTo
    就可以了

    但是,如果您需要以多种方式对狗进行排序,例如,一次您希望按年龄对狗进行排序,另一次您希望按名称对狗进行排序,这就是比较器方便使用的地方。您只需创建两个
    比较器
    ,一个按年龄排序,另一个按名称排序。当调用类似sort的方法时,您可以将要使用的比较器作为参数提供,以便获得所需的排序

    相对于您的问题

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

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

    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
    
    a.与(b)b.比较
    a、 比较(b)==0//与a==b相同
    a、 与(b)相比=0//与a相同=B
    a、 比较(b)=b
    
    至于它将如何与compare()排序不同,完全取决于您如何实现compareTo()

    下面是一个示例,说明如何假设phoneNumber有3个字段:区号前缀行号

        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   
                }   
    
    public int compareTo(电话号码pn){
    //比较区号
    如果(区号pn.areaCode){
    返回1;
    }   
    //区号相等,请比较前缀
    如果(前缀pn.prefix){
    返回1;
    }   
    //区号和前缀相等,比较行号
    如果(行号pn.lineNumber){
    返回1;
    }   
    返回0;//所有字段都相等
    }   
    
    While 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
    
    比较(a,b)b
    比较(a,b)==0//与a==b相同
    比较(a,b)=0//与a相同=B
    比较(a,b)=b
    

    答案对comparator和comparable有更详细、更清晰的解释。

    无论你们在做什么,这都是荒谬的<代码>狗不应实现比较器;您应该有一个单独的类(可能是匿名的)实现
    Comparator
    。同时,您希望
    这个.name
    是什么?这是这条狗的名字,与另一条狗比较。对于
    比较
    ,如果狗的年龄相同,则它们相等。否则,如果第一只狗年龄较大,它将返回一个正数,第二只狗返回一个负数。@louis I dint get u Sorry狗将实现动物(狗是一种动物),而不是比较器(狗不是一种比较器)
    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