-1

ソートされた配列内の任意の 2 つの数値間の最短距離を計算しようとしています。以下のアルゴリズムでテストしていますが、すぐ下に次のエラーが表示されます。私の配列が範囲外であることを示しているので、明らかに配列の長さではないインデックスにアクセスしようとしていますか? forループで長さをチェックしているので、理由はわかりません。誰も手がかりを持っていますか?

public static void getSmallestDistance(int[] integersCount)
{

    int index = 0;

    for(int i = 1; i < integersCount.length; i++  )
    {
        if( Math.abs(integersCount[index] - integersCount[index + 1]) >
        Math.abs( integersCount[i] - integersCount[i + 1]))//line 73 were error is
        {
            index = i;
        }



    }
    System.out.println(index);
}

次のエラーが表示されます。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1000
at ClosestPair.getSmallestDistance(ClosestPair.java:73)
at ClosestPair.main(ClosestPair.java:57)
4

5 に答える 5

2

問題は、配列の長さが isintegersCount.lengthの最大値でiあることですが、範囲外の配列にインデックスを付けるためにintegersCount.length - 1使用します。i+1

iしたがって、(必要に応じて) 0 または 1 からintegersCount.length - 2実行 する必要がありますi < integersCount.length - 2i <= integersCount.length - 1

于 2012-04-29T20:48:31.860 に答える
1
for(int i = 1; i < integersCount.length; i++  )

する必要があります

for(int i = 1; i < integersCount.length - 1; i++  )

これはあなたがするので:

integersCount[i + 1])

ArrayIndexOutOfBound(もちろん) iが最大のときにスローします。

他の回答者が指摘しているように、これは Java 配列が 0 から長さ 1 までのインデックスであり、for ループの最後の反復で i が長さ 1 になり、したがって i+1 が大きすぎるインデックスになるためです。

于 2012-04-29T20:48:52.677 に答える
0

integersCount[i + 1]ループ内で"ArrayIndexOutOfBoundsException"

たとえば、10 個の項目があり、for ループの最後の実行では、i は 9 になり、i + 1 は 10 になり、範囲外になります。

于 2012-04-29T20:49:45.590 に答える
0

for(int i = 1; i < integersCount.length; i++ ) を for(int i = 0; i < integersCount.length; i++ ) に変更してみてください

配列はアドレス 0 から始まると信じているので、最後に追加された数を取得するには、コンテンツの総数から 1 を引く必要があります。

編集

integersCount.length-1 を正しい integersCount.length に変更しました。これは、追加の数よりも小さくする必要があり、追加の数よりも小さくする必要がないためです - 1 ..

于 2012-04-29T20:50:13.153 に答える
0
for(int i = 1; i < integersCount.length; i++  )
{
  if( Math.abs(integersCount[index] - integersCount[index + 1]) >
      Math.abs( integersCount[i] - integersCount[i + 1]))//line 73 were error is 
      {
        index = i;
      }

どちらがi = integersCount.length - 1使用しようとしている配列の最後であり、integersCount[i + 1]明らかに配列の境界を超えている場合。

于 2012-04-29T20:50:56.150 に答える