Как вернуть правильное значение из массива int []? - PullRequest
0 голосов
/ 29 августа 2018

Я новичок в Java (и программировании в целом), поэтому извиняюсь, если что-то из этого не имеет смысла и / или если код действительно плохой:

Я пытаюсь получить уникальный четырехзначный код из пользовательского ввода (это то, что делает строка Keyboard.readInput), и я вставил пару условных выражений, чтобы гарантировать, что введенный код может быть только 4 цифры и что каждая цифра должна отличаться от других трех.

Операторы if работают так, как задумано, в том смысле, что они выводят сообщение об ошибке и предлагают ввести их заново (т.е. вызывается метод getPlayerGuess()). Например, если пользователь вводит 123 (т. Е. userGuess.length() != 4), он предложит ему войти снова. Если они затем введут 1234, метод завершится.

Однако проблема, с которой я столкнулся, заключается в том, что когда я вызываю этот метод в другом классе, который у меня есть, код, по которому выполняется проверка, - это первый введенный код (т. Е. 123), а не четырехзначный, который я хочу (т. Е. 1234). ) - что приводит к массиву IndexOutOfBoundsException.

Любые идеи о том, как я могу гарантировать, что возвращаемый код - это четырехзначный код, который проходит условные выражения, а не первый введенный код?

public int[] getPlayerGuess() {

    System.out.print("Guess a four digit code: ");
    String userGuess = Keyboard.readInput();

    if (userGuess.length() != 4) {
        System.out.print("Your code must be 4 digits - ");
        getPlayerGuess();
    }

    int[] userCode = createArrayFromGuess(userGuess);

    for (int i = 0; i < userCode.length-1; i++){
        for (int j = i+1; j < userCode.length; j++){
            if (userCode[i] == userCode[j]) {
                System.out.print("Code must have four unique digits - ");
                getPlayerGuess();
            }
        }
    }
    return userCode;
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы вызываете getPlayerGuess(), который возвращает int[], но вы не собираете и не присваиваете возвращаемое значение. И вы не возвращаете его ... так что что-то вроде следующего может работать для вас:

public int[] getPlayerGuess() {

  System.out.print("Guess a four digit code: ");
  String userGuess = Keyboard.readInput();

  if (userGuess.length() != 4) {
    System.out.print("Your code must be 4 digits - ");
    return getPlayerGuess(); // either assign or return the value that is actually calculated within that call...
  }

  int[] userCode = createArrayFromGuess(userGuess);

  for (int i = 0; i < userCode.length-1; i++){
      for (int j = i+1; j < userCode.length; j++){
          if (userCode[i] == userCode[j]) {
              System.out.print("Code must have four unique digits - ");
              return getPlayerGuess(); // either assign or return the value that is actually calculated within that call...
          }
      }
  }
  return userCode;
}

Немного упрощая ваш код (не слишком; -)):

public int[] getPlayerGuess(String msg) {
    System.out.print(msg);
    String userGuess = Keyboard.readLine();
    if (userGuess.length() != 4) {
        return getPlayerGuess("\nYour code must be 4 digits - ");
    }
    if (userGuess.chars().distinct().count() != 4) {
        return getPlayerGuess("\nCode must have four unique digits - ");
    }
    return createArrayFromGuess(userGuess);
}

с начальным вызовом:

getPlayerGuess("Guess a four digit code: ");

Обратите внимание, что вы можете написать этот код также с использованием итеративного подхода. Но я оставлю это на ваше усмотрение.

0 голосов
/ 29 августа 2018

Ваша проблема лежит здесь:

if (userGuess.length() != 4) {
      System.out.print("Your code must be 4 digits - ");
      getPlayerGuess();
    }

Да, вы вызываете метод второй раз, но полностью игнорируете его и ничего не делаете с его результатом.

Измените это на:

if (userGuess.length() != 4) {
      System.out.print("Your code must be 4 digits - ");
      return getPlayerGuess();
    }

Таким образом, вы вернете результат нового вызова вместо завершения кода после блока if.

EDIT: Лучший подход был бы:

System.out.print("Guess a four digit code: ");
String userGuess = Keyboard.readInput();

  while(userGuess.length() != 4) {
      System.out.print("Your code must be 4 digits - ");
      System.out.print("Guess a four digit code: ");
      userGuess = Keyboard.readInput();
    }
...