Преобразование числа в строку и вызов split("")
- это примерно самое медленное возможное решение, которое вы когда-либо могли придумать.
Если у вас 3-ди git число, и вам нужны 3 цифры, используйте операторы деления и остатка:
int i = /*assign some non-negative number of at most 3 digits*/;
int d1 = i / 100;
int d2 = i / 10 % 10;
int d3 = i % 10;
Если вам нужно N
чисел, вы не можете сгенерировать N
чисел и затем сбросить некоторые из них. Это оставило бы вас с меньшим , чем N
числами. Вы должны считать после отбрасывания неверных чисел.
static int[] generate(int n) {
// Numbers 100 and 101 contain duplicates, so lower limit is 102.
// Upper limit is 987 (inclusive), since 988, 989, and 99x all contain duplicates.
return new Random().ints(102, 988)
.filter(Test::isThreeUniqueDigits)
.limit(n)
.toArray();
}
private static boolean isThreeUniqueDigits(int i) {
int d1 = i / 100;
int d2 = i / 10 % 10;
int d3 = i % 10;
return (d1 != d2 && d1 != d3 && d2 != d3);
}
Или использовать лямбда-выражение вместо ссылки на метод:
static int[] generate(int n) {
return new Random().ints(102, 988).filter(i -> {
int d1 = i / 100, d2 = i / 10 % 10, d3 = i % 10;
return (d1 != d2 && d1 != d3 && d2 != d3);
}).limit(n).toArray();
}
Пример результатов
[416, 613, 401, 250, 507, 306, 179, 152, 850, 504]
[913, 304, 174, 874, 714, 245, 632, 890, 357, 382]
[618, 706, 946, 364, 209, 320, 690, 529, 824, 651]
[419, 386, 547, 471, 952, 917, 389, 469, 640, 285]
[120, 347, 549, 247, 619, 328, 814, 240, 984, 630]
[127, 174, 723, 287, 149, 329, 176, 964, 451, 617]
[539, 587, 768, 594, 296, 948, 157, 409, 952, 395]
[602, 392, 698, 761, 231, 764, 517, 147, 402, 841]
[194, 294, 923, 542, 362, 248, 352, 286, 407, 348]
[631, 502, 461, 439, 174, 278, 407, 394, 617, 370]
[754, 193, 539, 290, 504, 684, 921, 962, 724, 196]
[125, 586, 925, 857, 879, 761, 134, 620, 134, 723]
[457, 307, 524, 536, 249, 349, 901, 623, 247, 320]
[103, 903, 506, 645, 431, 802, 695, 761, 609, 867]
[569, 894, 608, 963, 681, 365, 162, 874, 452, 307]
[807, 178, 983, 837, 956, 273, 295, 527, 798, 406]
[157, 936, 398, 379, 618, 920, 957, 921, 430, 879]
[396, 280, 315, 569, 328, 138, 931, 623, 413, 926]
[987, 972, 518, 391, 138, 691, 372, 193, 402, 678]
[346, 328, 940, 768, 307, 419, 146, 950, 671, 530]