Ситуация такая. Создал 3 массива - соответствено на цифры и буквы, и один объединненый ( из которого мы и будем брать случайные символы).
Если в пароле присутствует хотя бы по 1 элементу из каждого массива то отправляем готовый результат, иначе рекурсим метод пока не получим нужный нам пароль.
В идеале все "как бы " работает , если можно так сказать, если нужный пароль генерируетсяс первого раза все ОК. Но если мы не получили нужный пароль с первого раза , то далее по логике идет перезапуск метода пока не будет найден подходящий пароль , вот тут и начинается какая-то белеберда, вообщем метод перезапускается к примеру 5 раз и последнее значение проходящее все условия проверки найдено. Вроде все, осталось его return , но подходя к return он начинает брать все старые (не подходящие значения пароля) и по очереди их листать пока не найдет самое первое и его вот и сделает return. Это отлично будет видно если поставите брекпоинт на 67 и 68 строке.
package com.javarush.task.task32.task3204;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/*
Генератор паролей
*/
public class Solution {
public static void main(String[] args) throws IOException {
ByteArrayOutputStream password = getPassword();
System.out.println(password.toString());
}
public static ByteArrayOutputStream getPassword() throws IOException {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
final String LOWER = "abcdefghijklmnopqrstuvwxyz";
final String UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String DIGITS = "0123456789";
char[] lowerChar = LOWER.toCharArray();
char[] upperChar = UPPER.toCharArray();
char[] digitsChar = DIGITS.toCharArray();
char[] sumChars = new char[lowerChar.length + upperChar.length + digitsChar.length];
System.arraycopy(lowerChar,0 ,sumChars,0,lowerChar.length);
System.arraycopy(upperChar,0 ,sumChars,lowerChar.length,upperChar.length);
System.arraycopy(digitsChar,0 ,sumChars,lowerChar.length + upperChar.length,digitsChar.length);
String passWord = "";
for (int i = 0; i < 8; i++) {
int random = (int) (Math.random() * (sumChars.length ));
passWord = passWord + sumChars[random];
}
int Low = 0;
for (int i = 0; i < lowerChar.length; i++) {
String a = String.valueOf(lowerChar[i]);
if (passWord.contains(a)){
Low++;
break;
}
}
for (int i = 0; i < upperChar.length; i++) {
String a = String.valueOf(upperChar[i]);
if (passWord.contains(a)){
Low++;
break;
}
}
for (int i = 0; i < digitsChar.length; i++) {
String a = String.valueOf(digitsChar[i]);
if (passWord.contains(a)){
Low++;
break;
}
}
if (Low < 3){
getPassword();
}
stream.write(passWord.getBytes());
return stream;
}
}