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