【问题标题】:Stopping increment in a for loop for a specific case in Java在 Java 中的特定情况下,在 for 循环中停止增量
【发布时间】:2012-05-06 03:46:00
【问题描述】:

本质上,我正在尝试使用 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--;
        }
}

【问题讨论】:

    标签: java arrays loops for-loop increment


    【解决方案1】:

    使用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.");
               }
        }
     }
    

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

    【讨论】:

    • 感谢您,试用了一下,效果很好! - 我有一个快速的问题。我假设我必须在函数中放置Scanner input = new Scanner(System.in)?那是对的吗?还是有其他方法可以做到这一点?
    • 是的,这是扫描仪的正确位置。您也可以将其设为全局变量,但这是一个更糟糕的解决方案。
    • 感谢您的帮助。它当然看起来更加“模块化”,并添加了一个功能! :)
    【解决方案2】:

    这几乎就是这样做的方法。您可以将其转换为 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.");
            }
    }
    

    【讨论】:

      【解决方案3】:

      您不知道用户将输入多少次无效输入,因此这是何时使用 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() 更改为 number,因为再次调用 nextInt() 将从您连接到扫描仪的任何输入流中读取。

      【讨论】:

        【解决方案4】:

        在特定条件下在循环代码中减少它。在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;
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-25
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 2014-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多