Java - リストからランダムなアイテム/要素を取得する

Java –リストからランダムなアイテム/要素を取得

1. 前書き

ランダムなList要素を選択することは非常に基本的な操作ですが、実装するのはそれほど明白ではありません。 この記事では、さまざまなコンテキストでこれを行う最も効率的な方法を示します。

2. ランダムなアイテムを選ぶ

Listインスタンスからランダムなアイテムを取得するには、ランダムなインデックス番号を生成してから、List.get()メソッドを使用してこの生成されたインデックス番号でアイテムをフェッチする必要があります。

ここで重要な点は、List’sの容量を超えるインデックスを使用してはならないことを覚えておく必要があります。

2.1. 単一のランダムアイテム

ランダムなインデックスを選択するには、Random.nextInt(int bound)メソッドを使用できます。

public void givenList_shouldReturnARandomElement() {
    List 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 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 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. ランダムシリーズを選択

ランダムな一連の要素を取得したい場合は、Collectionsutilsクラスが便利です。

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {
    List givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);
    Collections.shuffle(givenList);

    int randomSeriesLength = 3;

    List randomSeries = givenList.subList(0, randomSeriesLength);
}

3. 結論

この記事では、さまざまなシナリオでList instanceからランダム要素をフェッチする最も効率的な方法を検討しました.

コード例はGitHubにあります。