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.