1

特定の位置のアイテムが必要なArrayList場所からオブジェクトがありますが、アクティビティを起動するたびに、取得された位置はランダム化され、すべての位置アイテムが完全に取得されるまで繰り返されません。私はこの方法を使用しました:

public static int getRandomNumber(ArrayList<Integer> arr)
            throws IllegalArgumentException {
        try {
            Random random = new Random();
            int select = random.nextInt(arr.size());
            int randomnum = arr.get(select);
            GlobalData.randList.remove(select);
            return randomnum;
        } catch (IllegalArgumentException e) {

            for (int i = 0; i < arr.size(); i++) {

                GlobalData.randList.add(i);

            }
            return 0;
        }

しかし、重複した番号が来るなど、機能していません。アクティビティを再起動するたびに理由がある可能性があります。oncreate代わりに入れましonResumeたが、期待どおりに機能しませんか? それを扱う他の方法はありますか?解決策はありますか?

4

2 に答える 2

2

Collections.shuffle()配列をシャッフルするために使用します。別の変数を使用して、配列内の現在の位置を追跡します。新しい値を取得するたびに、変数がインクリメントされます。配列の最後に到達したら、再シャッフルします。

参考: シャッフルアルゴリズム

public class RandomArray {
    ArrayList<Integer> array = null;
    int position = 0;

    public RandomArray(ArrayList<Integer> arr) {
        array = arr;
        position = arr.size();
    }

    public int getNext() {
        if (position == array.size()) {
           position = 0;
           Collections.shuffle(array);
        }
        return array.get(position++);
    }
}
于 2013-01-17T16:38:18.093 に答える
1

元の順序を気にしない場合は、これを試すことができます。

Object[] array = new Object[10];    // say 10 objects
int remain = array.length;
Random rnd = new Random();

public Object next () {
    if (remain == 0) {
        return null;
    } else {
        int i = rnd.nextInt(remain--);
        Object tmp = array[i];
        array[i] = array[remain];
        array[remain] = tmp;
        return tmp;
    }
}

ArrayList でも同様のことができます。

まあ、このように、shuffle() メソッドよりも高速です。shuffle()の時間の複雑さは O(n) ですが、私のコードは O(1) です。

于 2013-01-17T16:52:46.050 に答える