Java –从列表中获取随机项目/元素

评论 0 浏览 0 2016-10-05

1.绪论

随机抽取一个List元素是一个非常基本的操作,但实现起来却不是那么明显。在这篇文章中,我们将展示在不同情况下最有效的操作方法。

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()));
}

代替随机类,你总是可以使用静态方法Math.random()并与列表大小相乘(Math.random()生成Double介于0(包容)和1(排他)之间的随机值,所以记得在乘法后将其铸为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 utils类可能会很方便。

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实例e中获取随机元素的最有效的方法,适用于不同的场景.

代码实例可以在GitHub上找到。

最后更新2022-12-14
0 个评论
标签