0
ArrayList <String> fil = new ArrayList<String>(); 
ArrayList <String> lif = new ArrayList<String>();

int x=0;
long tim = System.currentTimeMillis(); 
Random random = new Random(tim); 
for(int i=0;i<fil.size();i++)
{
 x =random.nextInt(fil.size());
         for(int y=0;y<lif.size();y++)
         {
             if(fil.get(x).equals(lif.get(y)))
             {
                 i--;
                 continue;
             }
         }
         System.out.println("Set the value of x"+x);
          lif.add(i, fil.get(x));//array index out of bound exception


     }

filArrayList の内容をlif別の順序でコピーしようとしていますがArrayIndexOutOfBoundException、コメント行に が表示されます。新しい ArrayList の要素が一意かどうかを確認するために、ネストされた for ループを使用しています。

4

6 に答える 6

3

Collections.copyおよびCollections.shuffleメソッドを試してみませんか。

于 2011-05-20T09:11:03.857 に答える
2

Collections.shuffleはより良い代替手段ではありませんか?

于 2011-05-20T09:11:27.953 に答える
1

「lif」-ArrayList は、コンテンツを再シャッフルする前に、「fil.size()」要素を保持するために事前に割り当てられている必要があります。for ループに入る前に "fil.size()" null 要素を追加してみてください。

ノート!これは、再シャッフルを行うための非常に非効率的なアプローチです。より良いアプローチについてはCollections.reshuffle()を参照してください。

于 2011-05-20T09:11:15.590 に答える
0
if(fil.get(x).equals(lif.get(y)))
{
    i--;
    continue;
}

考えられる問題の 1 つは、'i' が 0 (ゼロ) の場合です。デクリメントi--により「i」が -1 に設定され、例外が発生します...lif.add(i, fil.get(x));

それは答えではないかもしれませんが、i、x、y がすべて ArrayList オブジェクトの境界内にあることを確認する必要があります。

于 2011-05-20T09:11:40.050 に答える
0

コメント行を次のように変更します。

lif.add(fil.get(x));

これで例外が修正されるはずです。ただし、アルゴリズムはあまり良くありません。

于 2011-05-20T09:11:40.720 に答える
-2

コードをこれに変更し、それが機能するかどうかを確認します

x =random.nextInt(fil.size() - 1);
于 2011-05-20T09:15:15.250 に答える