Java –從列表中獲取隨機項目/元素

1.簡介

選擇一個隨機的List元素是一個非常基本的操作,但實現起來並不那麼明顯。在本文中,我們將展示在不同情況下執行此操作的最有效方法。

2.挑選一個或多個隨機物品

為了從List實例中獲取隨機項目,您需要生成一個隨機索引號,然後使用List.get()方法通過此生成的索引號來獲取項目。

這裡的重點是要記住,您所使用的索引不得超過List's大小。

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()而不是Random類,並將其與列表大小相乘( Math.random()生成介於0(含)和1( Math.random()之間的Double隨機值,因此請記住將其intint乘法後)。

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 instanc e於不同的場合.

可以在GitHub上找到代碼示例。