Как заполнить Arraylist случайными цифрами?
Мысленно отправляю плюсы в карму каждому, кто подскажет)
Итак, есть задача:
Создать 2 массива Arraylist по 7 цифр в каждом, а затем заполнить их случайными числами от 0 до 9 включительно. После чего вывести эти два массива в консоль так, чтобы их числа были отсортированы - от большего к меньшему. Условный пример того, что нужно увидеть в консоли в итоге:
[0,2,5,6,7,8,9]
[0,1,1,5,6,7,9]
И вот, собственно, ключевой вопрос:
Как в коде ниже заполнить списки winningNumbers и playersNumbers случайными числами, а потом отсортировать их по возрастанию?
import java.util.ArrayList;
public class lottery {
public static void main(String[] args) {
ArrayList winningNumbers = new ArrayList<>();
ArrayList playersNumbers = new ArrayList<>();
}
}
Ответы (2 шт):
Сгенерировать список примерно так:
var list = new Random().ints(0, 10).limit(7).boxed().collect(Collectors.toList());
Напечатать в консоль сортированый список в обратном порядке:
var reverseSortedList = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList())
System.out.println(reverseSortedList);
Приведённый код напоминает начало реализации некой лотереи, судя по названиям списков playerNumbers, winningNumbers, поэтому скорее всего дубликаты не должны допускаться в обоих списках.
Для генерации списков без дубликатов при помощи Stream API следует применить операцию Stream::distinct перед ограничением длины списка:
public static List<Integer> randomList(int min, int maxIncl, int count) {
return new Random() // или более непредсказуемый генератор SecureRandom()
.ints(min, maxIncl + 1) // IntStream, значения [min, maxIncl]
.distinct() // уникальные значения (дубликаты исключены)
.limit(count) // ограничить длину списка
.sorted() // сортировать по возрастанию
.boxed() // Stream<Integer>
.collect(Collectors.toList()); // или toList() JDK 16+
}
List<Integer> winningNums = randomList(0, 9, 7);
List<Integer> playerNums = randomList(0, 9, 7);
Или же можно просто сгенерировать список из всех допустимых значений (от 0 до 9), перемешать его используя Collections.shuffle, а затем взять нужное количество элементов и отсортировать его.
public static List<Integer> randomList(int min, int maxIncl, int count) {
List<Integer> allNums = IntStream.rangeClosed(min, maxIncl)
.boxed()
.collect(Collectors.toList());
Collections.shuffle(allNums);
return IntStream.range(0, Math.min(count, allNums.size())) // индексы
.mapToObj(allNums::get) // Stream<Integer>
.sorted() // сортировать по возрастанию
.collect(Collectors.toList());
}