0

このバブル ソートを実行すると null ポインター例外が発生します。理由がわかりません。誰か問題を説明してもらえますか?

for(int i = 1; i < clipArray.length; i++) {
    for(int j = 0; j < clipArray.length - 1; j++) {
        if(((clipArray[j].getSurname()).compareToIgnoreCase((clipArray[j+1].getSurname()))) > 0) {
            Clip temp = clipArray[j];
            clipArray[j] = clipArray[j+1];
            clipArray[j+1] = temp;
        }
    }
}
for(int g = 0; g < clipArray.length; g++) {
    System.out.println(clipArray[g].getSurname());
}

配列内のオブジェクトの姓を出力しようとしています。

配列内の 2 つの要素でテストしましたが、他のすべての要素は null です。

3 行目の if 文で例外が発生します。

4

3 に答える 3

0

おそらく、これはバブル ソートを作成するための学術的な実験ですが、そうでない場合は、独自のソート アルゴリズムを作成する必要はありません。Arrays.sortは、それまたはその一部を簡単にソートできます。

Arrays.sort(clipArray, 0, 2, new Comparator<Clip>() {
    public int compare(Clip c1, Clip c2) {
        return c1.getSurname().compareToIgnoreCase(c2.getSurname());
    }
});
于 2013-10-25T03:43:43.380 に答える
0

長さが null 以外の要素の数と一致するように、clipArray を短くします。そうすれば、null 要素を読み込もうとすることはなくなります。姓を読み取るときに配列を拡張したい場合は、Java Collections API から ArrayList クラスのインスタンスを使用できます。

また、気にするかどうかはわかりませんが、外側のループで不必要な反復を行うよりもわずかに効率的ですが、スワップがない場合、flag が false に設定されている while(flag) を実行することです。ここにあるようなもの:

http://mathbits.com/MathBits/Java/arrays/Bubble.htm

于 2013-10-25T03:32:22.307 に答える
0

ここでの問題は、並べ替えでこれらの null 要素にアクセスしていることです。あなたの配列は2つの要素よりも長いと思います。代わりに、オブジェクトが null の場合の if ステートメントに別の条件を含めます。

if(clipArray[i] != null && clipArray[j] != null && ...Rest of your statements here)

または、事前に要素がいくつあるかを追跡します。したがって、int要素が 2 つしかないことを知っている があります。代わりに、それをヒットするまでループします。

Java は、実際には ArrayList を介してこれを行う方法を提供します。ドキュメントはここにあります。長さをループする代わりに、 を呼び出すだけ.size()です。

于 2013-10-25T03:27:57.190 に答える