我是Java新手,我正在尝试了解比较器接口。 我尝试了以下代码:
package comparator;
import java.io.*;
import java.util.*;
public class comparator {
public static void main(String args[]){
bankAccount[] ba=new bankAccount[500];
ba[0]=new bankAccount(50);
ba[1]=new bankAccount(90);
ba[2]=new bankAccount(20);
Comparator c=new comparing();
System.out.println(c.compare(ba[0], ba[1]));
Arrays.sort(ba, c);
}
}
class bankAccount{
public bankAccount(double bal){
balance=bal;
}
public double balance;
}
class comparing implements Comparator{
public int compare(Object first, Object second){
bankAccount ba1=(bankAccount)first;
bankAccount ba2=(bankAccount)second;
int retval;
if(ba1.balance<ba2.balance){
retval=-1;
}
else if(ba1.balance>ba2.balance){
retval=1;
}
else{
retval=0;
}
return retval;
}
}
我收到以下错误消息:
Exception in thread "main" java.lang.NullPointerException
at comparator.comparing.compare(comparator.java:29)
at java.util.TimSort.binarySort(TimSort.java:265)
at java.util.TimSort.sort(TimSort.java:208)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at comparator.comparator.main(comparator.java:13)
我能知道错误是什么吗?我应该如何使用Arrays.sort()方法。任何帮助将是真诚的感谢。
答案 0 :(得分:8)
在main
方法中,您已经声明了一个500长度的数组,但只初始化了3个元素,因此其中497个是null
。这会导致比较器出现问题,因为比较器会被调用多对元素,包括一些null
元素。
尝试修改main
方法,仅声明并初始化3长度数组,然后再次编译并运行它。也许你的比较器确实存在问题,但至少让我们删除明显的问题并尝试对所有元素进行排序 - null
。
答案 1 :(得分:1)
除了Platnium Azure之前的回答之外,您还应该在Comparator
子类中使用泛型,如下所示:
class comparing implements Comparator<bankAccount>
{
...
@Override
public int compare(bankAccount first, backAccount second)
{
...
}
@Override
public boolean equals(Object obj)
{
...
}
...
}
这将强制使用您的comparing
类来仅对bankAccount
个实例进行排序。
答案 2 :(得分:0)
问题在于你只填充了500条目数组的前3个条目,sort方法贯穿其中并进行比较,直到它满足条目4,这是null,在尝试时抛出NPE调用其compareTo(..)
方法。
你可以通过填充数组或只给它3的长度来修复它。
答案 3 :(得分:0)
将bankAccount数组的大小更改为3。
如果任何数组元素为null,如果比较器不支持null,它将抛出空指针异常;
以下代码适用于数组大小500,因为比较器处理null case。
if (first == null || second == null)
{
return 0;
}
修改后的原始类代码从修复开始(查找比较类中的更改):
import java.io.*;
import java.util.*;
public class comparator {
public static void main(String args[]){
bankAccount[] ba=new bankAccount[500];
ba[0]=new bankAccount(50);
ba[1]=new bankAccount(90);
ba[2]=new bankAccount(20);
Comparator c=new comparing();
System.out.println(c.compare(ba[0], ba[1]));
Arrays.sort(ba, c);
}
}
class bankAccount{
public bankAccount(double bal){
balance=bal;
}
public double balance;
}
class comparing implements Comparator{
public int compare(Object first, Object second){
bankAccount ba1=(bankAccount)first;
bankAccount ba2=(bankAccount)second;
int retval;
if (first == null || second == null)
{
return 0;
}
if(ba1.balance<ba2.balance){
retval=-1;
}
else if(ba1.balance>ba2.balance){
retval=1;
}
else{
retval=0;
}
return retval;
}
}
答案 4 :(得分:0)
您的数组未完全初始化,如果您不想初始化它,请更改comparing
class comparing implements Comparator{
public int compare(Object first, Object second){
bankAccount ba1=(bankAccount)first;
bankAccount ba2=(bankAccount)second;
int retval;
if (ba1==null || ba2 == null) {
retval=0; // return what you want if bankAccount is null.
}
else if(ba1.balance<ba2.balance){
retval=-1;
}
else if(ba1.balance>ba2.balance){
retval=1;
}
else{
retval=0;
}
return retval;
}
}