0

我是 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() 方法。任何帮助将不胜感激。

4

5 回答 5

8

在您的main方法中,您声明了一个长度为 500 的数组,但只初始化了 3 个元素,因此其中 497 个是null. 这会在您的比较器中引起问题,因为比较器被许多元素对调用,包括一些元素null

尝试修改您的main方法以仅声明和初始化一个 3 长度数组并再次编译并运行它。也许您的比较器确实有问题,但至少让我们消除明显的问题并尝试在所有元素都为非的情况下进行排序null

于 2013-11-06T05:19:14.243 回答
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实例进行排序。

于 2013-11-06T05:22:27.123 回答
0

问题在于您只填充了 500 个条目数组的前 3 个条目,sort 方法运行这些条目并进行比较,直到它遇到条目 4,它为空,当它尝试调用它的compareTo(..)方法时抛出 NPE .

您可以通过填充数组或仅将其长度设为 3 来修复它。

于 2013-11-06T05:20:01.963 回答
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;
}
}
于 2013-11-06T05:25:25.680 回答
0

将 bankAccount 数组的大小更改为 3。

如果任何数组元素为空,如果您的比较器不支持空,它将抛出空指针异常;

下面的代码适用于数组大小 500,因为比较器处理 null 情况。

    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;
    }
}
于 2013-11-06T05:22:10.153 回答