Как правильно построить логику?

119
01 августа 2019, 07:50

У меня есть утилитный класс, где я задаю рандомное число, перекидываю его в массив, где каждый символ - это один элемент массива, и при этом символы не должны повторяться. По сути все работает хорошо, но мне не нравится как я проверяю повторяются символы или нет, для моей задачи у меня должно быть 4-х значное число, и я делаю проверку путем сравнивания каждого символа с другим, ну а если у меня будет 10-ти значное число, это уже никуда не годится, подскажите как правильно написать это сравнение, или же есть другие способы.

import java.util.Random;
public class Util {
    public static int[] randInt(int min, int max) {
        Random random = new Random();
        int randomNum;
        int [] arr;
        do {
            randomNum = random.nextInt((max - min) + 1) + min;
            String s = Integer.toString(randomNum);
            arr = new int[s.length()];
            for (int i = s.length() - 1; i >= 0; i--) {
                arr[i] = randomNum % 10;
                randomNum /= 10;
            }
        } while (arr[0] == arr[1] || arr[0] == arr[2] || arr[0] == arr[3] ||
                arr[1] == arr[2] || arr[1] == arr[3] || arr[2] == arr[3]);
        return arr;
    }
}

т.е. мне не нравятся эти строки -

(arr[0] == arr[1] || arr[0] == arr[2] || arr[0] == arr[3] || arr[1] == arr[2] || arr[1] == arr[3] || arr[2] == arr[3]);

Answer 1

Для того, чтобы избежать проверок вообще, используйте перемешивание Фишера-Йетса (Fisher-Yates shuffle)

В данном случае для генерации массива цифр длиной N<=10 нужно выполнить N операций выбора из массива цифр "0".."9"

Если результат на самом деле представляет собой число длиной N, то может понадобиться выполнять первый случайный выбор, игнорируя ноль

Answer 2

Проверить что все (независимо от их количества) цифры в массиве разные можно так:

  • Заводим хранилище уже просмотренных цифр
  • Проверяем по очереди все цифры в массиве
  • Если очередная цифра уже есть в хранилище, то прерываем проверку и считаем, что массив некорректен
  • Иначе добавляем цифру в хранилище
  • Если все цифры прошли проверку успешно - значит, массив корректен

Реализация с использованием в качестве хранилища HashSet-а:

public static int[] randInt(int min, int max) {
    Random random = new Random();
    int[] arr;
    boolean isCorrectNumber;
    do
    {
        int randomNum = random.nextInt((max - min) + 1) + min;
        String s = Integer.toString(randomNum);
        arr = new int[s.length()];
        for (int i = s.length() - 1; i >= 0; i--)
        {
            arr[i] = randomNum % 10;
            randomNum /= 10;
        }
        isCorrectNumber = true;
        Set<Integer> seenDigits = new HashSet<>();
        for (int digit : arr)
        {
            if (seenDigits.contains(digit))
            {
                isCorrectNumber = false;
                break;
            }
            seenDigits.add(digit);
        }
    }
    while (!isCorrectNumber);
    return arr;
}

Если нельзя использовать HashSet, то для цифр в качестве хранилища можно использовать просто массив на 10 элементов:

isCorrectNumber = true;
boolean[] seenDigits = new boolean[10];
for (int digit : arr)
{
    if (seenDigits[digit])
    {
        isCorrectNumber = false;
        break;
    }
    seenDigits[digit] = true;
}
READ ALSO
Как собрать JavaFX проект c Gradle или Maven в Intelij Idea?

Как собрать JavaFX проект c Gradle или Maven в Intelij Idea?

Пишу проект на JavaFX и Scene BuilderСтолкнулся с необходимостью собрать нормально проект

121
Не работает TranslateTransition в javafx

Не работает TranslateTransition в javafx

Я пытаюсь сделать анимацию открывания меню в javafx с помощью TranslateTransition, но почему то не выходитМне нужно что бы AnchorPane двигался вправо(по X) на 200 пикселей

129
Проблема после сборки JavaFX приложения

Проблема после сборки JavaFX приложения

не открывается страница приложения после сборкиВот код контроллера fxml от этой страницы, там ошибок нет и при компилировании в среде все работает,...

146
Поиск в графе java

Поиск в графе java

Дан массив A длины (n+1), содержащий натуральные числа от 1 до nНайти любой повторяющийся элемент за время O(n), не изменяя массив и не используя...

166