Предположим, я беру входной параметр как int и хочу вернуться в String. Как я могу это сделать? Я хочу, чтобы каждый раз после генерации пароля обязательно один специальный символ, один верхний регистр, один нижний регистр. Как я могу это сделать?
Я написал этот код ниже и получил решение, но оно не добавляет каждый раз прописные, строчные и специальные символы в сгенерированный вывод.
public int GeneratePassword(int length) {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu vwxyz0123456789~`!@#$%^&*()-_=+[{]}\\|;:\'\",<.>/?";
String pwd = RandomStringUtils.random(length , characters );
System.out.println("pwd: = "+pwd );
return 0;
}
Похоже, вы только что скопировали и вставили ответ от stackoverflow.com/a/31260788/6895166
@Rab commons.apache.org/proper/commons-lang/apidocs/org/apache/…
я использую эту библиотеку.
Либо сохраните текущий код, но убедитесь, что сгенерированная строка соответствует вашим критериям, и повторно сгенерируйте ее до тех пор, пока она не появится, либо случайным образом решите, сколько специальных / верхних / нижних / цифр у вас будет и где они будут в строке, а затем сгенерируйте строку с помощью выбор символов определенных символов




Хосе Мартинес уже предоставил отличный метод для достижения цели, это фрагмент кода из его метода.
public static String getPassword(int length) {
assert length >= 4;
char[] password = new char[length];
//get the requirements out of the way
password[0] = LOWERCASE[rand.nextInt(LOWERCASE.length)];
password[1] = UPPERCASE[rand.nextInt(UPPERCASE.length)];
password[2] = NUMBERS[rand.nextInt(NUMBERS.length)];
password[3] = SYMBOLS[rand.nextInt(SYMBOLS.length)];
//populate rest of the password with random chars
for (int i = 4; i < length; i++) {
password[i] = ALL_CHARS[rand.nextInt(ALL_CHARS.length)];
}
//shuffle it up
for (int i = 0; i < password.length; i++) {
int randomPosition = rand.nextInt(password.length);
char temp = password[i];
password[i] = password[randomPosition];
password[randomPosition] = temp;
}
return new String(password);
}
если вы хотите проверить весь метод, обязательно проверьте его ответ, все заслуги ему.
Вот один из подходов с использованием SecureRandom и StringBuilder
private static String generateRandomString(int length)
{
StringBuilder sb = new StringBuilder();
SecureRandom rnd = new SecureRandom();
String uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String lowercaseChars = "abcdefghijklmnopqrstuvwxyz";
String specialChars = "0123456789~`!@#$%^&*()-_=+[{]}\\\\|;:\\'\\\",<.>/?";
boolean nextIsUppercase = false;
boolean nextIsLowercase = false;
boolean nextIsSpecial = true;
for (int i = 0; i < length; i++) {
if (nextIsSpecial) {
sb.append(specialChars.charAt(rnd.nextInt(specialChars.length())));
nextIsUppercase = true;
nextIsSpecial = false;
continue;
}
if (nextIsUppercase) {
sb.append(uppercaseChars.charAt(rnd.nextInt(uppercaseChars.length())));
nextIsUppercase = false;
nextIsLowercase = true;
continue;
}
if (nextIsLowercase) {
sb.append(lowercaseChars.charAt(rnd.nextInt(lowercaseChars.length())));
nextIsLowercase = false;
nextIsSpecial = true;
continue;
}
}
return sb.toString();
}
Пример вывода:
System.out.println(generateRandomString(1)); -> 7
System.out.println(generateRandomString(2)); -> :Q
System.out.println(generateRandomString(3)); -> 8St
System.out.println(generateRandomString(4)); -> =Lv%
System.out.println(generateRandomString(16)); -> %Uf-Hs<Ea|Wp;Rt}
Это решение вашей проблемы:
public static String GeneratePassword(int length) {
String[] characters = {"0123456789","~!@#$%^&*()-_=+[{]}|;:\'\",<.>/?","ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"};
Random rand = new Random();
String password = "";
for(int i=0;i<length;i++) {
int random = rand.nextInt(4);//choose a number from 0 to 3(inclusive)
int string_size = characters[random].length();//get length of the selected string
int random1 = rand.nextInt(string_size);//choose a number from0 to length-1 of selected string
char item = characters[random].charAt(random1);//selects the character
password=password+item;//Concatenates with the password
}
return password;
}
К сожалению, это не так. Это выводит, например, wt # или 5'6K, чего не просили.
Как должен выглядеть результат?
Что такое RandomStringUtils?