У меня есть утилитный класс, где я задаю рандомное число, перекидываю его в массив, где каждый символ - это один элемент массива, и при этом символы не должны повторяться. По сути все работает хорошо, но мне не нравится как я проверяю повторяются символы или нет, для моей задачи у меня должно быть 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;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей