从下面的代码我不理解两件事:
CompareTo()
和Compare()
方法返回int
,但这对排序有何影响?
该方法返回this.name.compareTo(d.name)
。 this.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() + ", ");
}
}
答案 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回答对比较器和可比较的问题有更详尽和清晰的解释。