概述

在不同上下文中随机选择一个列表元素是一个基本操作,但实现起来可能不太明显。本文将展示在各种情况下最有效的实现方法。

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上找到。


« 上一篇: Java周报,145