我需要从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);
}
答案 0 :(得分: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
,可以先制作副本。
答案 1 :(得分:0)
是的,随机性的性质可能会再次给出相同的数字。
要摆脱这种情况,你必须手动检查以前收到的新随机数,然后抛出你不想要的所有内容。
答案 2 :(得分:0)
复制你的清单,所以你不要弄乱你的旧清单
List<Object> randomList = new ArrayList<Object>(oldList);
选择一个
int index = new Random().nextInt(randomList.size());
Object randomObj = randomList.get(index);
randomList.remove(index);
因此每次选择一个,你都不能再选一个。
答案 3 :(得分:0)
我在这里回答你问题的标题。我使用Set
来确保每个数字都是唯一的,我不会停止添加数字,直到它等于我想要的大小。然后我将其转换为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);
}
}