Необходимо ввести в строку 128 произвольных символов!
Стоит задача проверить, что название может содержать не более 128 символов! Подскажите пожалуйста, как сгенерировать 128 рандомных символов и вставить в строку! язык -java
Ответы (3 шт):
Нужно сделать цикл for от нуля до 127. В цикле в StringBuilder на каждую итерацию вписывать по символу. Символ это обычный char от 0 до 255, емнип. Соответственно в каждой итерации генерируйте случайную цифру/цисло от 0 до 255, преобразуйте в char и дописывайте в StringBuilder.
Вы можете сделать вот такой генератор рандомного String, обычно я использую такой:
import java.util.Random;
public class Main {
public static void main(String[] args) {
System.out.println(generateRandomString(128));
}
public static String generateRandomString(int length) {
Random random = new Random();
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
}
Пример результата выполнения: XUDpqVP5VwfxdPjhW54rhRfIBTKqewVx6lXcrKuhPz2Y9FRF68ibrwR5h837ONsdq5ZKjLDDDTnVpRp7yHO4TInak4VbbEGKLiZI1OS03tI97SB4Cd0wZtLAqAta23Dk
Более лаконичный способ для генерации строк из действительно случайных символов, а не только из буквенноцифровых, состоит в использовании метода Random::nextBytes, для получения случайного массива байтов:
public static String getRandomStringBytes(int n) {
byte[] bytes = new byte[n];
new Random().nextBytes(bytes);
return new String(bytes, Charset.forName("ISO-8859-1"));
}
Таким способом при необходимости можно получить полную абракадабру, включающую непечатаемые символы, а при использовании многобайтных кодировок типа UTF-8 (Charset.forName("UTF-8")) длина строки может оказаться меньше заявленной.
Также для получения случайной строки для известного диапазона символов можно использовать Stream API, в частности метод Random::ints, и получившийся поток кодовых точек легко преобразовать в строку:
public static String getRandomString(int n, char from, char to) {
return new Random().ints(n, from, to + 1)
.collect(() -> new StringBuilder(n), StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
}
public static String getRandomAlphanum(int n, char from, char to) {
return new Random().ints(from, to + 1)
.filter(Character::isLetterOrDigit)
.limit(n)
.collect(() -> new StringBuilder(n), StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
}
Сравнение трёх способов:
System.out.println("bytes 128: " + getRandomStringBytes(128));
System.out.println("chars 128: " + getRandomString(128, ' ', 'z'));
System.out.println("alnum 128: " + getRandomAlphanum(128, ' ', 'z'));
bytes 128: M˜²ÊK ¦ËÏÀ|*ÁXsΚ‘dÆ^2…¾š™÷œ0AB6HhÀf'?Ëí!IYRR+¹ä˜-LMoöþ?)GîÑ‘zÀßü9ãõ¯J1…w+eÂd5Ùα“Zå›Eà˜~ÆöR½Þ
Æ…9Ö`#‹¬»l&Bš>ffi§
chars 128: 4[]9nuTgXbW6d`X54p];XQY*QjsSB:mdY<N0YAS4%]-l's,5jjYV;\<"$\a"?N;^u&h.M3"'=Vv59_WS7C%@We[GSRl)rm90yi!@44Te9BxN2eFQ[r2DP%;32b`oq7n?
alnum 128: h9P2byiYXzjDSQT9Ac3ODwW8Uu1LimKHHIzvvpwUhE59lNLca7HlSmcoIZGxTqBf7q2p4ufoxKbWqD7wiDwPlEQpuajmk8E9C5EaaOBQH7Zwcljr9ZCUqFlOyjyNEEuN
Также следует упомянуть, что в библиотеке Apache Commons Lang есть класс RandomStringUtils, в котором реализовано множество методов для генерации случайных строк нужной длины и формата: randomAlphabetic, randomAlphanumeric, randomAscii, randomNumeric, random