Siga preguntando hasta que se dé el valor correcto con matrices 2D

Actualmente estoy trabajando en un pequeño proyecto impartido por un curso de edX. Me quedé con una cosa, tomar valores de los usuarios y almacenarlos en una matriz 2D. Sin embargo, los valores deben estar en un rango, por lo que necesito volver a solicitar lo mismo, que son las condiciones necesarias cumplidas.

He encontrado una solución por mí mismo, pero no sé si es una práctica común o si hay una mejor manera de hacerlo.

Dejame explicar;

Entonces tengo esta matriz como esta:

int[][] userCoordinates = new int[5][2];

Quiero llenar esta matriz con la información de coordenadas del usuario, pero las coordenadas deben estar entre 0 y 9.

Hice algo como esto;

int coordinateValueX = 0, coordinateValueY = 0;
Scanner input = new Scanner(System.in);

for (int i = 0; i < userCoordinates.length; i++) {

 // X - Value

 for (int j = 0; j <= 0; j++) {
  System.out.print("Enter X coordinate for your " + (i + 1) + ". ship:");
  coordinateValueX = input.nextInt();

  if (gridCheck(coordinateValueX)) {
   j--;
  }
 }

 // Y - Value

 for (int j = 1; j <= 1; j++) {
  System.out.print("Enter Y coordinate for your " + (i + 1) + ". ship:");
  coordinateValueY = input.nextInt();

  if (gridCheck(coordinateValueY)) {
   j--;
  }
 }
}

Y el método gridCheck es este:

public static boolean gridCheck(int coordinateValue) {
    boolean flag = false;
    if (coordinateValue > 9 || coordinateValue < 0) {
        System.err.println("Invalid grid, please give your coordinate again.");
        flag = true;
    }
    return flag;
}

Intenté usar while-continue, pero el problema es que cuando el usuario da un valor Y incorrecto, vuelve a pedir el valor x porque itera al siguiente ciclo.

Abierto a las sugerencias, gracias de antemano.

Respuesta 1

Su problema no tiene nada que ver con las matrices, se trata de la entrada.

Cree un método que solicite un valor al usuario y no regrese hasta que obtenga un valor dentro de un cierto rango, algo como:

private int askForInt(Scanner scanner, String coordName, int max) {
    while (true) {
        System.out.print("Give your " + coordName + " coordinate: ");
        int i = input.nextInt();
        input.nextLine(); // clear new line from buffer
        if (i >= 0 && i <= max) {
            return i;
        }
        System.err.println("Please enter a number between 0 and " + max);
    }
}

Ahora su código principal se vuelve limpio y simple. No es necesario disminuir las variables de bucle (por lo general, se debe evitar modificar las variables de bucle dentro de un bucle; es confuso al leer el código), y puede centrarse en la lógica principal del bucle sin la molestia de una entrada incorrecta del usuario.

Respuesta: 2

Al usar javax.mail.Message # setRecipeints, noté algo por primera vez y quería saber más al respecto. Este es mi código: List <InternetAddress> ccRecipients = new ArrayList <...

class Main {public static void main (String [] args) {Window h = nueva ventana (100,100); }} class Window {marco JFrame privado; Ventana pública (int ...

En aras de que todos entiendan mi problema, he creado un programa GUI simple que muestra mi problema. Primero pondré los códigos para que los analices. Y luego, mira el video a continuación para ver ...

El siguiente programa (prog1) arroja el error OutOfMemoryError. Con razón Pero si agrego sysout debajo de la línea 5 (prog2), no arrojará un error. ¿Alguna razón para este extraño comportamiento? prog1: public static void main (...