Java - Zufälliges Element/Element aus einer Liste abrufen

Java - Zufälliges Element aus einer Liste holen

1. Einführung

Das Auswählen eines zufälligenList-Elements ist eine sehr grundlegende Operation, deren Implementierung jedoch nicht so offensichtlich ist. In diesem Artikel zeigen wir Ihnen, wie Sie dies in verschiedenen Kontexten am effizientesten tun können.

2. Auswählen eines zufälligen Elements / von zufälligen Elementen

Um ein zufälliges Element aus einerList-Instanz zu erhalten, müssen Sie eine zufällige Indexnummer generieren und dann ein Element anhand dieser generierten Indexnummer mit der MethodeList.get()abrufen.

Der wichtigste Punkt hierbei ist, dass Sie keinen Index verwenden dürfen, der die Kapazität vonList’süberschreitet.

2.1. Einzelner zufälliger Gegenstand

Um einen zufälligen Index auszuwählen, können Sie die MethodeRandom.nextInt(int bound)verwenden:

public void givenList_shouldReturnARandomElement() {
    List givenList = Arrays.asList(1, 2, 3);
    Random rand = new Random();
    int randomElement = givenList.get(rand.nextInt(givenList.size()));
}

Anstelle der KlasseRandomkönnen Sie immer die statische MethodeMath.random() verwenden und diese mit der Listengröße multiplizieren (Math.random() generiertDouble Zufallswert zwischen 0 (einschließlich) und 1 (exklusiv) Denken Sie also daran, es nach der Multiplikation aufint zu setzen.

2.2. Wählen Sie Zufallsindex in Multithread-Umgebung

Wenn Sie Multithread-Anwendungen mit der Klasseninstanz eines einzelnenRandomchreiben, wird möglicherweise für jeden Prozess, der auf diese Instanz zugreift, derselbe Wert ausgewählt. Wir können immer eine neue Instanz pro Thread erstellen, indem wir eine dedizierteThreadLocalRandom-Klasse verwenden:

int randomElementIndex
  = ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. Wählen Sie Zufällige Elemente mit Wiederholungen

Manchmal möchten Sie vielleicht einige Elemente aus einer Liste auswählen. Es ist ganz einfach:

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. Wählen Sie Zufällige Elemente ohne Wiederholungen

Hier müssen Sie sicherstellen, dass das Element nach der Auswahl aus der Liste entfernt wird:

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. Wählen Sie Zufällige Serien

Wenn Sie eine zufällige Reihe von Elementen erhalten möchten, kann die Utils-KlasseCollectionshilfreich sein:

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. Fazit

In diesem Artikel haben wir die effizienteste Methode zum Abrufen zufälliger Elemente ausList Instanze für verschiedene Szenarien. untersucht

Codebeispiele finden Sie aufGitHub.