return возвращает неожидаемый результат

109
10 июня 2021, 15:30

В сообщении хочу вывести сгенерированый пароль. От меня программа ждёт цифру определяющую количество символов в нём. С генерацией пароля проблем не вижу, но результат, по моей задумке дложен быть передан от функции к функции через return

public class SITM {
    public static void main(String[] args) throws IOException {
        System.out.println(getPass());
    }
    public static int getPass() throws IOException { //здесь будем "делать" пароль
        Random random = new Random(); // он выбирает, случайным образом индекс символа из масива 
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // с его помощью я укажу желаемую длину пароля
        char[] symbolsArray = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '~', '!', '@', '#', '$' , '%', '^', '&', '*', '(', ')', '|', '}', '{', ':', '?'};
        int longOfTHEpass = Integer.parseInt(reader.readLine()); // переменная отвественная за длину а значит указывает количество интераций цикла
        int y = 0; // в неё я хочу сохранить сгенерированый результат, она мне необходима вне цикла поэтому объявляю её заранее

        for (int p = 1; p <= longOfTHEpass; p ++){ // заходим в цикл 
            int r = random.nextInt(symbolsArray.length); // складываем в переменную символы из массива с рандомными индексами
            y = symbolsArray[r]; // копируем результат в заранее определённую переменную 
        }
        return y; // хочу возвратить результат
    }
}

Программа не "падает" Но на введёную мней цифру выводит не ожидаемый результат. Я жду строку из символов а получаю только цифры. Как мне получить мой пароль?

спасибо проявившим беспокойство по поводу моего вопроса!

проимер кода без вызова одной функции другой функцией, прямой так сказать:

public class CTFP {
static final Random myRandNumb = new Random();
public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    char[] symbolsArray = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '~', '!', '@', '#', '$' , '%', '^', '&', '*', '(', ')', '|', '}', '{', ':', '?'};

    int a = Integer.parseInt(reader.readLine());// long of the password
    System.out.print(stringStore.plzYourPas);
    for (int i = 0; i < a; i ++){
        int y  = myRandNumb.nextInt(symbolsArray.length);
        System.out.print( symbolsArray[y]);
    }
    System.out.println("");
}

}

так что , как видите переменная "у" в этом случае не обесценивается.

Answer 1

Если вы хотите генерировать строку, то и генерируйте строку, а не число.
В цикле вы вообще приравниваете y каждый раз к новому случайному значению, что обесценивает все предыдущие итерации.

Правильный код (со StringBuilder):

final static Random random = new Random();
final static char[] symbolsArray = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '~', '!', '@', '#', '$' , '%', '^', '&', '*', '(', ')', '|', '}', '{', ':', '?'};
public static String getPass() {
    int lengthOfThePassword = new Scanner(System.in).nextInt();
    StringBuilder password = new StringBuilder();
    for (int p = 0; p < lengthOfThePassword; p++)
        password.append(symbolsArray[random.nextInt(symbolsArray.length)]);
    return password.toString();
}

Или с char[]:

public static String getPass() {
    char[] password = new char[new Scanner(System.in).nextInt()];
    for (int i = 0; i < password.length; i++)
        password[i] = symbolsArray[random.nextInt(symbolsArray.length)];
    return new String(password);
}

А вообще не хорошо ставить сканер внутрь метода, лучше сделать метод getPass(int length).

READ ALSO
regex для определения страны в скобках

regex для определения страны в скобках

Помогите составить регулярное выражение, для определения страны в круглых скобкахНапример даны строки:

170
Скрыть курсор при вводе текста

Скрыть курсор при вводе текста

Имеется приложение с разными контролами в которые можно вводить текстХочу что бы когда активировалась клавиатура скрыть курсор

135
Кириллица в HTML в Spring MVC проекте

Кириллица в HTML в Spring MVC проекте

Делаю свой сайт на спрингеВсё работает

164
Как получить название метода после ClassName&hellip;?

Как получить название метода после ClassName…?

У меня есть класс ClassNameНапример, я обращаюсь к нему ClassName

104