У меня есть утилитный класс, где я задаю рандомное число, перекидываю его в массив, где каждый символ - это один элемент массива, и при этом символы не должны повторяться. По сути все работает хорошо, но мне не нравится как я проверяю повторяются символы или нет, для моей задачи у меня должно быть 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]);
Для того, чтобы избежать проверок вообще, используйте перемешивание Фишера-Йетса (Fisher-Yates shuffle)
В данном случае для генерации массива цифр длиной N<=10
нужно выполнить N
операций выбора из массива цифр "0".."9"
Если результат на самом деле представляет собой число длиной N
, то может понадобиться выполнять первый случайный выбор, игнорируя ноль
Проверить что все (независимо от их количества) цифры в массиве разные можно так:
Реализация с использованием в качестве хранилища 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Пишу проект на JavaFX и Scene BuilderСтолкнулся с необходимостью собрать нормально проект
Я пытаюсь сделать анимацию открывания меню в javafx с помощью TranslateTransition, но почему то не выходитМне нужно что бы AnchorPane двигался вправо(по X) на 200 пикселей
не открывается страница приложения после сборкиВот код контроллера fxml от этой страницы, там ошибок нет и при компилировании в среде все работает,...
Дан массив A длины (n+1), содержащий натуральные числа от 1 до nНайти любой повторяющийся элемент за время O(n), не изменяя массив и не используя...