如何从中取n个随机元素ArrayList<E>?理想情况下,我希望能够连续调用该take()方法以获取另一个x元素,而无需替换。
ArrayList<E>
take()
两种主要方式。
Random#nextInt(int)
List<Foo> list = createItSomehow(); Random random = new Random(); Foo foo = list.get(random.nextInt(list.size()));
但是,不能保证连续的n调用返回唯一的元素。
n
Collections#shuffle()
List<Foo> list = createItSomehow(); Collections.shuffle(list); Foo foo = list.get(0);
它使您能够n通过递增索引来获得唯一元素(假设列表本身包含唯一元素)。
如果您想知道是否有Java 8Stream方法;不,没有内置的。没有Comparator#randomOrder()标准API中的东西(还可以吗?)。您可以在满足严格Comparator合同的情况下尝试以下操作(尽管分发情况非常糟糕):
Comparator#randomOrder()
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()改用。