2016-09-25 5 views
-2

私のJavaプログラムで配列リストの配列リストに関する例外が発生しました。私は以下の私のプログラムの関連部分を含めました。IndexOutOfBoundsException:インデックス:3、サイズ:0

List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 
    for (int i = 0; i < n; i++) 
    { 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 
    } 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      inverse_men_preference.get(i).add(marriage.getMenPreference().get(i).get(j), j); 
     } 
    } 

私は同様の質問を見て、私の配列リストのサイズが空であると見なされている理由私はまだ把握できませんでした。私はJavaに慣れていないので、エラーの理解を妨げる基本的な誤解があると思った。どんな入力や提案も役に立ちます。ありがとうございました。

+3

[何がjava.lang.ArrayIndexOutOfBoundsExceptionを引き起こすのですか?それを防ぐにはどうすればいいですか?](http://stackoverflow.com/questions/5554734/what-c​​auses-a-java-lang-arrayindexoutofboundsexception-and-どのように私はそれを防止する) – vaxquis

答えて

3

あなたは、ArrayListに項目を入れていません。 nは、その容量ではなく、容量です。いつでもコレクションのsize()を使用し、ここでやっているようにmagic numbersを使用しないでください。

+0

ありがとう。配列リストに10個の配列リストを追加した最初のforループがなぜ10個のサイズを作らないのでしょうか?私の質問が意味をなさないことを願っている – Gopika

+0

@Gopika彼は明らかに、inverse_men_preferenceに追加したArrayListについて話しています。彼らは空です。 – Tom

+1

@Tomご清聴ありがとうございます!私は問題がArrayList inverse_men_preferenceであったと自動的に推測しました。 – Gopika

0

marriage.getMenPreference().get(i).get(j)の部分が原因でエラーが発生しているようです。おそらくmarriage.getMenPreference()によって返されたリストのいずれかがithまたはjth要素を持たないかもしれません。私たちは、一定であることを交換した場合、それは例えば、正常に動作します:

int n = 2; 
List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 
for (int i = 0; i < n; i++) { 
    inverse_men_preference.add(new ArrayList<Integer>(n)); 
} 

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
     inverse_men_preference.get(i).add(0, j); 
    } 
} 

あなたは上記の実行される前に取り込ま/ marriage.getMenPreference()を初期化していることを確認してください。

+0

返信いただきありがとうございます!これらは既に実装された関数に渡されるため、これは問題ではありません。 – Gopika

0

あなたのリストに問題はありません。例外は1つの整数を追加するのではなく、2つの引数を持つメソッド "add"を呼び出すときに指定されます。これは良い作品:

public static void main(String[] args) { 
    int n = 10; 
    List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 

    for (int i = 0; i < n; i++) 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 

    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) 
      inverse_men_preference.get(i).add(5); 
} 

これはあなたが何をすべきかであるのに対し:

public static void main(String[] args) { 
    int n = 10; 
    List<List<Integer>> inverse_men_preference = new ArrayList<List<Integer>>(n); 

    for (int i = 0; i < n; i++) 
     inverse_men_preference.add(new ArrayList<Integer>(n)); 

    for (int i = 0; i < n; i++) 
     for (int j = 0; j < n; j++) 
      inverse_men_preference.get(i).add(5, 34); 
} 

リストを使用すると、先頭に/真ん中に/それの最後に要素を挿入することができ、このようなコレクションです。それは空ですが、要素を追加することはできません。第5の位置にある。私がお勧めするのは、arraylistの代わりに配列を使うことです。したがって、いつでも別の場所に値を挿入することができます。

+0

あなたの答えをありがとう。 addメソッドは、インデックスとそのインデックスに追加される要素の2つの引数をとります。ではなぜ私のアプローチはうまくいかないでしょうか? – Gopika

+0

@Gopikaあなたの例外を説明するために私の答えを編集しました。 –

+0

返信いただきありがとうございます!あなたのような配列の配列リストを使用しました。私は空の配列リストの問題がないので、これは私の最初のエラーを取り除いた。しかし、arraylistの配列は初期化されていないため、NULLポインタ例外が発生するため、後でエラーが発生します。私の以前の問題と本質的に同じです。また、2つのオブジェクトが同じインデックスにマップされているときに、addメソッドのシフトプロパティを利用したいので、配列ではなく配列リストを使用する必要があることに気付きました。 – Gopika

関連する問題