1

我需要从中挑选一些随机值ArrayList,但值不能重复。使用下面的代码,我只需选择随机值,但它们可以重复。

    for (int i = 0; i < 5; i++) {

        index = random.nextInt(menuItems.size());
        HashMap<String, String> urls = new HashMap<String, String>();

        urls.put("Value", menuItems.get(index).get(KEY_URL));

        randomitems.add(urls);

    }
4

4 回答 4

7

如果你不需要保持menutItems特定的顺序,你可以简单地洗牌并取前 5 个项目:

Collections.shuffle(menuItems);
for (int i = 0; i < 5; i++) {
    HashMap<String, String> urls = new HashMap<String, String>();
    urls.put("Value", menuItems.get(i).get(KEY_URL));
    randomitems.add(urls);
}

如果您确实需要保持menuItems原样,您可以先制作一份副本。

于 2013-03-06T21:08:59.983 回答
0

是的,可能会再次给出相同的数字,这是随机性的本质。

要摆脱这种情况,您必须手动检查新的随机数与以前收到的随机数并扔掉所有您不想要的。

于 2013-03-06T21:10:19.227 回答
0

复制你的清单,这样你就不会弄乱你的旧清单

List<Object> randomList = new ArrayList<Object>(oldList);

选一个

int index = new Random().nextInt(randomList.size());
Object randomObj = randomList.get(index);
randomList.remove(index);

所以每次你选一个,你就不能再选那个了。

于 2013-03-06T21:10:29.087 回答
0

我在这里回答你的问题的标题。我使用 aSet来确保每个数字都是唯一的,并且我不会停止添加数字,直到它等于我想要的大小。然后我将其转换为List

package com.sandbox;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class Sandbox {

    private static final int TOTAL_NUMBERS_I_WANT = 5;

    public static void main(String[] args) {
        Random random = new Random();
        Set<Integer> nonRepeatingRandomNumbers = new HashSet<Integer>();
        while (nonRepeatingRandomNumbers.size() < TOTAL_NUMBERS_I_WANT) {
            nonRepeatingRandomNumbers.add(random.nextInt());
        }
        List<Integer> result = new ArrayList<Integer>(nonRepeatingRandomNumbers);
        System.out.println(result);
    }
}
于 2013-03-06T21:14:49.957 回答