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 回答