Java - Obter item / elemento aleatório de uma lista
1. Introdução
Escolher um elementoList aleatório é uma operação muito básica, mas não tão óbvia de implementar. Neste artigo, mostraremos a maneira mais eficiente de fazer isso em diferentes contextos.
2. Escolhendo um Item / Itens Aleatórios
Para obter um item aleatório de uma instânciaList, você precisa gerar um número de índice aleatório e, em seguida, buscar um item por esse número de índice gerado usando o métodoList.get().
O ponto principal aqui é lembrar que você não deve usar um índice que exceda sua capacidade deList’s.
2.1. Único item aleatório
Para selecionar um índice aleatório, você pode usar o métodoRandom.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()));
}
Em vez da classeRandom, você sempre pode usar o método estáticoMath.random()e multiplicá-lo pelo tamanho da lista (Math.random() geraDouble valor aleatório entre 0 (inclusivo) e 1 (exclusivo) , então lembre-se de convertê-lo emint após a multiplicação).
2.2. Selecione o índice aleatório no ambiente multithread
Ao escrever aplicativos multithread usando a única instância de classeRandom, pode resultar na escolha do mesmo valor para todos os processos que acessam essa instância. Sempre podemos criar uma nova instância por thread usando uma classeThreadLocalRandom dedicada:
int randomElementIndex
= ThreadLocalRandom.current().nextInt(listSize) % givenList.size();
2.3. Selecionar itens aleatórios com repetições
Às vezes, você pode escolher alguns elementos de uma lista. É bem direto:
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. Selecione itens aleatórios sem repetições
Aqui, você precisa garantir que o elemento seja removido da lista após a seleção:
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. Selecione a série aleatória
No caso de desejar obter uma série aleatória de elementos, a classeCollections utils pode ser útil:
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. Conclusão
Neste artigo, exploramos a maneira mais eficiente de buscar elementos aleatórios de uma instânciaListe para diferentes cenários.
Os exemplos de código podem ser encontrados emGitHub.