2014-01-13 55 views
1

我正在做一些分配工作,并且遇到了问题。比较器比较方法()int无法取消引用

我一直在考虑这个例子代码:

public class PersonNameComparator implements Comparator<Person>{ 
public int compare(Person p1, Person p2) { 
    int retValue = p1.getName().compareTo(p2.getName()); 
    if (retValue != 0) 
     return retValue; 
    else if (p1.getAge() < p2.getAge()) 
     return -1; 
    else if (p1.getAge() > p2.getAge()) 
     return 1; 
    else 
     return 0; 
} 
} 

但是当我尝试这样做,出现这种情况:

public class DVDComparator implements Comparator <DVD> { 

public int compare(DVD d1,DVD d2) 
    {  
    int stars1 = d1.getNoOfStars().compareTo(d2.getNoOfStars()); 
    //ERROR - int cannot be dereferenced. 

任何想法?

回答

2

您不需要调用方法来比较基元int s。事实上,正如你发现的那样,你不能。

只需使用正常的<,>==运营商比较int即可。

只要确保遵循contract of compare - 比0返回int小于,等于0,或大于0更大,如果d1“小于” d2,如果d1“等于” d2,或d1被“大于”d2,分别。

比较它的两个参数的顺序。由于第一个参数小于,等于或大于第二个参数,因此返回负整数,零或正整数。

1

int是一个原语,不是一个对象,因此没有任何方法,因此当您尝试对其调用.compareTo时,会出现错误。

要比较整数,可以使用标准比较运算符< > ==,*或*,您可以将它包装在Integer对象中,并使用比较方法。虽然前者是有利的。

1

由于getNoOfStars()返回一个原语int,并且没有为原语类型定义的方法compareTo(),您会收到此错误消息。

如果您使用的是Java SE 7,你可以使用这样的事情:

public class DVDComparator implements Comparator <DVD> { 

    public int compare(DVD d1,DVD d2){  
     return Integer.compare(d1.getNoOfStars(), d2.getNoOfStars()); 
    } 
} 
0

//如果Person.getName()返回一个字符串,那么你可能根本就以下为//实现可比:

public class PersonNameComparator implements Comparator<Person>{ 
    public int compare(Person p1, Person p2) { 
    return p1.getName() - p2.getName();  // It's the ninja way to do it 
    } 
} 
+0

*“如果Person.getName()返回一个字符串,那么您可以简单地执行以下操作......”*创建编译时错误。 – Tom