一尘不染

从列表中获取n个随机元素?

algorithm

如何从中取n个随机元素ArrayList<E>?理想情况下,我希望能够连续调用该take()方法以获取另一个x元素,而无需替换。


阅读 471

收藏
2020-07-28

共1个答案

一尘不染

两种主要方式。

  1. 用途Random#nextInt(int)
        List<Foo> list = createItSomehow();
    Random random = new Random();
    Foo foo = list.get(random.nextInt(list.size()));

但是,不能保证连续的n调用返回唯一的元素。

  1. 用途Collections#shuffle()
        List<Foo> list = createItSomehow();
    Collections.shuffle(list);
    Foo foo = list.get(0);

它使您能够n通过递增索引来获得唯一元素(假设列表本身包含唯一元素)。


如果您想知道是否有Java 8Stream方法;不,没有内置的。没有Comparator#randomOrder()标准API中的东西(还可以吗?)。您可以在满足严格Comparator合同的情况下尝试以下操作(尽管分发情况非常糟糕):

    List<Foo> list = createItSomehow();
    int random = new Random().nextInt();
    Foo foo = list.stream().sorted(Comparator.comparingInt(o -> System.identityHashCode(o) ^ random)).findFirst().get();

最好Collections#shuffle()改用。

2020-07-28