0

それぞれがいくつかの「qid」を持つオブジェクトのリストがあります。qid整数です。リストの「qid」は、「min」とは言えず、「max」とは言えません。リスト内のオブジェクトの「qid」は連続していないことに注意してください。たとえば、最小=6および最大=31ですが、qidが含まれるオブジェクトは16個しかない[min,max]ため(最小と最大の両方を含む)、(31-6 + 1)-16のオブジェクトは存在しません。 =10qids。これらの10個のqidを持つことを意味し、オブジェクトは存在しません。ただし、有効なqidを持つオブジェクトは16個しか存在しません。

これで、正確にサイズ10のint配列ができました。この配列には、ランダムに10個のオブジェクトを格納しますが、それらの有効なqidを使用します。つまり、これらの10個のオブジェクトは、26個ではなく16個のものでなければなりません。

そして私は次のことをしています

for (int j = 0; j < 10; j++) {
    checkList[j] = min + (int) (Math.random() * ((max - min) + 1));
    if (qidList.get(checkList[j]) == null ) {
        j--;
        continue;
    } else {
        finalList.add(j,qidList.get(checkList[j])); 
    }
}
  1. qidList = max=31およびmin=6の26個のオブジェクトのうち有効なqidを持つ16個の有効なオブジェクトを含む元のリスト。
  2. finalList =ランダムに選択された10個のオブジェクト(26個のうち16個からではなく)が保存される最終リスト。
  3. checkList =サイズ10の整数配列。ランダムに選択された10個のfinalListオブジェクトのqid(他の属性ではない)のみが格納されます。

私は得てindexoutofboundsexceptionいます。誰かが私を助けることができますか?

4

2 に答える 2

0

あなたのコメント(現在は明らかに削除されています)から、問題はにあるように見えます。問題がにあるqidList.getかのようにcheckList[j]、前の行に例外がスローされていたはずです。したがって、maxがqidListのサイズよりも小さいことを確認してください。そうでない場合は、getメソッドで次のIndexOutOfBoundsExceptionを取得できます。リストAPIから:

IndexOutOfBoundsException - if the index is out of range (index < 0 || index >= size())

更新: これを防ぐには、次のように変更します。

if ((checkList[j] >= qidList.size()) || (qidList.get(checkList[j]) == null)) {
    j--;
    continue;
}

または、ループに入る前に設定maxすることをお勧めしますqidList.size() - 1

于 2012-07-17T15:21:04.820 に答える
0

for ループ内で j をデクリメントしているため、おそらく 0 を超えて (つまり -1 以上)、これは indexOutOfBounds をスローしています。

編集:

「qidList.get(checkList[j]) == null」という行でエラーが発生するというコメントに基づいて、明らかに qidList には「checkList[j] = min + (int ) (Math.random() * ((最大 - 最小) + 1));" qidList のサイズを超える値が設定されています!

デバッグするために checkList[j] の値を出力してください!

于 2012-07-17T15:06:55.090 に答える