6

ループで遊んでいる間に以下のコードを作成しました。以下のコードは、フィボナッチ値を配列に格納し、for ループを使用して出力します。

    int [] numbers;
    numbers = new int[25];

    numbers[0] = 1;
    numbers[1] = 1;
    System.out.println("Initializing the array values");

    for(int i = 2; i < numbers.length; i++)
    {
        numbers[i] = numbers[i-1] + numbers[i-2];
    }

    System.out.println("Printing out Fibonacci values");

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

上記のコードは正常に動作します。ただし、最初にまとめたときは、強化された for ループを使用して値を出力しました (コードの 2 番目の for ループ)。これは問題なくコンパイルされますが、実行すると次のようになります。

Initializing the array values
Printing out Fibonacci values
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34
at ArrayDemo.main(ArrayDemo.java:21)

何が悪かったのかわかりません。2 番目のループを変更しても、値は変更されません (フィボナッチ値が間違っている (つまり値が欠落している) ことに気付くでしょう)。そして、単純な強化された for ループがインデックスをスキップする理由がわかりません。これはプロジェクトなどのためのものではないので、大したことではありません。手がかりはありますか?

強化された for ループは次のようになります。

for(int i : numbers)
    {
        System.out.print(numbers[i] + ", ");
    }
4

3 に答える 3

5
for(int i : numbers)
{
     System.out.print(numbers[i] + ", ");
}

iこれは、インデックスではなく、配列内の要素です。よりも大きい可能性がありnumbers.lengthます。

たとえば、、、、のnumbers = {1,2,3,9}場合。しかし、その長さは 4 なので、その中の要素をループするときは、そのサイズを超えることをしようとしています。i1239numbers[9]

あなたはおそらくしたいですSystem.out.print(i + ", ");

于 2013-05-18T11:14:33.907 に答える
5

for(int i = 0; i <= numbers.length; i++)する必要があります

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

Java では、配列は 0 ベースのインデックスです。これは、最初の要素はインデックス 0 でアクセスし、明らかに配列の長さから 1 を引いた位置で最後の要素にアクセスする必要があることを意味します。

int tab[] = new int[3]; //tab of length 3
tab[0] = 11;
tab[1] = 24;
tab[2] = 5;

tab[2]ここでは、 orを呼び出して最後の要素にアクセスしますtab[tab.length-1]。これは同等です。


申し訳ありませんが、それは私が質問に出したコードの間違いでした。

問題は、あなたがすべきことです:強化された for ループについて、これこれSystem.out.print(i + ", "); を読むべきです。

for ステートメントには、コレクションと配列を介した反復用に設計された別の形式もあります。この形式は、拡張 for ステートメントと呼ばれることもあり、ループをよりコンパクトで読みやすくするために使用できます。デモとして、1 から 10 までの数値を保持する次の配列を考えてみましょう。

int[] numbers = {1,2,3,4,5,6,7,8,9,10};

次のプログラムEnhancedForDemoは、拡張された for を使用して配列をループ処理します。

class EnhancedForDemo {
    public static void main(String[] args){
         int[] numbers = 
             {1,2,3,4,5,6,7,8,9,10};
         for (int item : numbers) {
             System.out.println("Count is: " + item);
         }
    }
}

この例では、変数 item は、numbers 配列からの現在の値を保持します。

したがって、現在のインデックスではなくitem、数値配列からの現在の値を保持します。それがあなたが得る理由です。IOOBE

于 2013-05-18T11:09:01.710 に答える
2
for(int i : numbers)
{
    System.out.print(numbers[i] + ", ");
}

する必要があります

   for(int i : numbers)
    {
        System.out.print(i + ", ");
    }

拡張 for ループでインデックスを使用する必要はありません。

于 2013-05-18T11:15:52.837 に答える