#java
Необходимо получить массив размером 4, значения элементов которого находятся в диапазоне от 1 до 4 и не повторяются. Т.е. массив должен быть, например, 3 1 4 2 или 1 3 4 2. Каков оптимальный алгоритм для решения задачи?
Ответы
Ответ 1
Можно использовать статический метод shuffle класса Collections: ArrayListdata = new ArrayList (); for (int i = 1; i <= 4; i++) data.add(i); Collections.shuffle(data); И дальше можно c помощью data.toArray() получить необходимый массив. Ответ 2
Используя один из вариантов тасования Фишера-Йетса: public static void main(String[] args) { int[] array = { 1, 2, 3, 4 }; Random rand = new Random(); for (int i = array.length - 1; i > 0; i--) { int index = rand.nextInt(i + 1); int swap = array[index]; array[index] = array[i]; array[i] = swap; } System.out.println(Arrays.toString(array)); }Ответ 3
В дополнение к варианту с тасованием массива, ещё один, не требующий предварительного заполнения массива: int n = 4; int[] a = new int[n]; for (int i = 0; i < n; ++i) { int j = rand.nextInt(i + 1); a[i] = a[j]; a[j] = i + 1; } Ещё одно преимущество такого подхода - в процессе перетасовки можно увеличить размер массива (с корректировкой переменной n). Если же нужна последовательность начиная с нуля, то можно в предпоследней строке убрать + 1. Ссылка на рабочий пример.Ответ 4
Можно сделать так: private static int[] getArray(int dimension) { Random random = new Random(); return IntStream .generate(() -> random.nextInt(dimension) + 1) .distinct() .limit(dimension) .toArray(); }Ответ 5
Криво, замедляет программу, но можно так: public class Name { static int items = 4; static int wait = 500; static Lista = new ArrayList<>(); public static void main(String[] args) throws InterruptedException { for (int id = 0; id < items; id++) new Rand(id).start(); Thread.sleep(wait); for (int i = 0; i < items; i++) System.out.println(a.get(i)); } public static synchronized void addA(int i) { a.add(i); } static class Rand extends Thread { int id; public Rand(int id) { this.id = id; } @Override public void run() { try { Thread.sleep(new Random().nextInt(wait)); } catch (InterruptedException e) {e.printStackTrace();} addA(id); } } }
Комментариев нет:
Отправить комментарий