Java - Ottieni un elemento / elemento casuale da un elenco

1. Introduzione

Scegliere un elemento di elenco casuale è un'operazione molto semplice ma non così ovvia da implementare. In questo articolo, mostreremo il modo più efficiente per farlo in diversi contesti.

2. Scegliere un oggetto / oggetti casuali

Per ottenere un elemento casuale da un'istanza di List , è necessario generare un numero di indice casuale e quindi recuperare un elemento mediante questo numero di indice generato utilizzando il metodo List.get () .

Il punto chiave qui è ricordare che non devi usare un indice che supera le dimensioni della tua lista .

2.1. Oggetto singolo casuale

Per selezionare un indice casuale, puoi utilizzare il metodo 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())); }

Invece della classe Random , puoi sempre utilizzare il metodo statico Math.random () e moltiplicarlo per la dimensione dell'elenco ( Math.random () genera un valore Double casuale tra 0 (incluso) e 1 (esclusivo), quindi ricorda di lanciarlo a int dopo la moltiplicazione).

2.2. Seleziona Indice casuale in ambiente multithread

Quando si scrivono applicazioni multithread utilizzando la singola istanza della classe Random , potrebbe risultare nella scelta dello stesso valore per ogni processo che accede a questa istanza. Possiamo sempre creare una nuova istanza per thread utilizzando una classe ThreadLocalRandom dedicata :

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

2.3. Seleziona elementi casuali con ripetizioni

A volte potresti voler scegliere alcuni elementi da un elenco. È abbastanza semplice:

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. Seleziona elementi casuali senza ripetizioni

Qui, devi assicurarti che l'elemento venga rimosso dall'elenco dopo la selezione:

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. Seleziona Random Series

Nel caso in cui desideri ottenere una serie casuale di elementi, la classe Collections utils potrebbe essere utile:

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

In questo articolo, abbiamo esplorato il modo più efficiente di recupero elementi casuali da una lista Instan e per diversi scenari .

Esempi di codice possono essere trovati su GitHub.