1

ご参考までに、最初に最も小さい数値で配列を並べ替えようとしているのではなく、最初に 0 に最も近い数値で配列リストを表示して配列を並べ替えようとしています。

配列内の一部の要素では機能しますが、配列を逆方向に移動する必要がある場合は機能しません..境界外の例外をスローするだけです

ここに私のコードがあります:

package SSTF;

public class test2 {

    public static void main (String[] args)
    {
        int[] temp_array = {9, 22, 3, -4, 5, 8};



        for(int i =0; i<temp_array.length; i++)
        {   

                System.out.print(temp_array[i] + "    ");
    }

    System.out.println("\n\nNumbers closest to 0:\n");

    closestToZero(temp_array);



    }

    public static void closestToZero(int[] array) 
    {
        int num = array[0];
        int absNum = Math.abs(num);


        for(int i = 1; i < array.length; ++i) 
        {
            int newAbs = Math.abs(array[i]);

            if(newAbs < absNum) 
            {

                absNum = newAbs;
                num = array[i];

                for(int j=0; j<array.length; j++)
                {
                    System.out.print(array[i+j] + "   ");
                }
            }   
        }
    }
}

修正方法がわからないので、それがほんの小さなものであり、誰かが助けてくれることを本当に願っています:S

出力:

9    22    3    -4    5    8    

Numbers closest to 0:

3   -4   5   8 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at SSTF.test2.closestToZero(test2.java:42)
    at SSTF.test2.main(test2.java:18)
4

5 に答える 5

2

問題は次のとおりです。

System.out.print(array[i+j] + "   ");

次の場合は、次のことを考慮してください。

  • i == array.length - 1
  • j == array.length - 1、 それから
  • の合計i+j2 * array.length - 2

これは、配列の範囲外になる可能性が非常に高くなります。

于 2012-11-21T22:24:38.200 に答える
2

i+j内側のループで使用します。あなたがそこで何をしようとしているのかは完全にはわかりませんが、これらの変数の両方が到達できるためlength-1、明らかに合計はそれよりも大きくなるため、境界例外が発生します。

ゼロに近い要素を見つけるたびに、配列を新しく出力する理由を自問する必要があります。

于 2012-11-21T22:25:22.177 に答える
2

この問題は、次のコード行で発生する可能性が最も高いです。

System.out.print(array[i+j] + "   ");

i + jそれが常に配列の有効なインデックスであることを保証できますか? 有効なインデックスは 0 から の間でなければならないことに注意してくださいsize - 1。ここsizeで、 は配列の要素数です。

于 2012-11-21T22:25:52.790 に答える
2

他の人が指摘しているようにi+j、例外を引き起こしているのは配列にインデックスを付けるための使用です。

ここで、独自の並べ替えルーチンをゼロから作成する代わりに、次の回答のコードと適切なコンパレータを使用します。

https://stackoverflow.com/a/3699501/367273

Integer[]の代わりに使えれば、int[]も必要なく、そのままArrayUtils使えArrays.sort(T[] a, Comparator<? super T> c)ます。

于 2012-11-21T22:33:12.003 に答える