概述
在不同上下文中随机选择一个列表元素是一个基本操作,但实现起来可能不太明显。本文将展示在各种情况下最有效的实现方法。
2. 选择随机项/项
为了从List
实例中获取一个随机项,你需要生成一个随机索引,然后使用List.get()
方法通过这个生成的索引获取项目。
关键点是记住不要使用超过List
大小的索引。
2.1. 单个随机项
为了选择随机索引,你可以使用Random.nextInt(int bound)
方法:
public void givenList_shouldReturnARandomElement() {
List<Integer> givenList = Arrays.asList(1, 2, 3);
Random rand = new Random();
int randomElement = givenList.get(rand.nextInt(givenList.size()));
}
如果你不使用Random
类,可以始终使用静态方法Math.random()
,并将其乘以列表大小(Math.random()
生成的是0(包含)到1(不包含)之间的Double
随机值,所以记得乘完后转换为int
)。
2.2. 在多线程环境中的随机索引选择
在使用单个Random
类实例编写多线程应用程序时,可能会导致每个访问此实例的进程都选择相同的值。我们可以为每个线程创建一个新的实例,使用专门的ThreadLocalRandom
类:
int randomElementIndex
= ThreadLocalRandom.current().nextInt(listSize) % givenList.size();
2.3. 随机选择重复元素
有时你可能想要从列表中选择几个元素。这相当直接:
public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() {
Random rand = new Random();
List<String> givenList = Arrays.asList("one", "two", "three", "four");
int numberOfElements = 2;
for (int i = 0; i < numberOfElements; i++) {
int randomIndex = rand.nextInt(givenList.size());
String randomElement = givenList.get(randomIndex);
}
}
2.4. 随机选择不重复的元素
这里,你需要确保在选择后从列表中删除元素:
public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() {
Random rand = new Random();
List<String> givenList = Lists.newArrayList("one", "two", "three", "four");
int numberOfElements = 2;
for (int i = 0; i < numberOfElements; i++) {
int randomIndex = rand.nextInt(givenList.size());
String randomElement = givenList.get(randomIndex);
givenList.remove(randomIndex);
}
}
2.5. 选择随机序列
如果你想获取随机元素序列,Collections
工具类可能会很有用:
public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {
List<Integer> givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);
Collections.shuffle(givenList);
int randomSeriesLength = 3;
List<Integer> randomSeries = givenList.subList(0, randomSeriesLength);
}
3. 总结
在这篇文章中,我们探讨了在不同场景下从List
实例中获取随机元素的最有效方法。
代码示例可以在GitHub上找到。