1

本质上,我正在尝试使用 for 循环将用户输入存储在多维数组中。如果用户输入了不期望/不想要的内容(例如小于 0),则会显示一条警告消息,并且循环应该理想地“等待”直到它接收到下一个有效整数。

目前,如下所示,我的代码可以正常工作,但我想知道是否有更好/更优化的方法来做到这一点。

for (int row = 0; row < array.length; row++) {
    for (int column = 0; column < array[row].length; column++) {
        int number = input.nextInt();
        if((input.nextInt() >= 0) {
            array[row][column] = number;
        } else {
            System.out.println("Input must be > 0.");
            column--;
        }
}
4

4 回答 4

2

使用do..while循环等待用户输入有效的内容。这比修改循环计数器更干净。

for (int row = 0; row < array.length; row++) {
        for (int column = 0; column < array[row].length; column++) {
            bool hasEnteredValidInput = false;
            do
            {
               int number = input.nextInt();
               if(number  >= 0) {
                  array[row][column] = number;
                  hasEnteredValidInput = true
               } else {
                  System.out.println("Input must be > 0.");
               }
            } while (!hasEnteredValidInput);
        }
    }

更好的办法是将阅读代码提取到它自己的函数中:

for (int row = 0; row < array.length; row++) {
        for (int column = 0; column < array[row].length; column++) {
             array[row][column] = readValidInputFromUser();   
        }
 }

 public string readValidInputFromUser()
 {
    while(true)
    {
           int number = input.nextInt();
           if(number >= 0) {
              return number;
           } else {
              System.out.println("Input must be > 0.");
           }
    }
 }

这个版本非常清楚你在做什么。

于 2012-05-06T03:49:50.047 回答
1

这几乎就是这样做的方法。您可以将其转换为 while 循环,但我认为没有理由这样做。

int column = 0;
while ( column < array[row].length) {
        int number = input.nextInt();
        if((input.nextInt() >= 0) {
            array[row][column] = temp;
            ++column;
        } else {
            System.out.println("Input must be > 0.");
        }
}
于 2012-05-06T03:48:15.350 回答
1

您不知道用户将输入多少次无效输入,因此这是何时使用 while 循环的主要示例。

试试这个:

for (int row = 0; row < array.length; row++) {
    for (int column = 0; column < array[row].length; column++) {
        int number = input.nextInt();
        if(number >= 0) {
            array[row][column] = temp;
        } 
        else 
        {
            while(number < 0)
            {
                System.out.println("Input must be > 0.");
                number = input.nextInt();
            } 
        }
}

另请注意,在您的 if 语句中,我更改了 if input.nextInt()to,number因为再次调用nextInt()将从您连接到扫描仪的任何输入流中读取。

于 2012-05-06T03:50:22.057 回答
0

在特定条件下在循环代码中减少它。看来您确实是这样做的,以防万一column--

您也可以在当前的 for 循环中这样做:

for (int row = 0; row < array.length; row++) {
    for (int column = 0; column < array[row].length; column++) {
        int number;
        do {
            number = input.nextInt();
            if(number<0)  System.out.println("Number should be >= 0, enter again");
        }while(number<0);
        array[row][column] = number;

    }
}
于 2012-05-06T03:47:43.403 回答