2012-05-06 12 views
1

本来、forループを使用して多次元配列にユーザー入力を格納しようとしています。ユーザが期待しない(例えば0未満の)タイプのものを入力すると、警告メッセージが表示され、次の有効な整数を受け取るまで、ループは理想的に「待機」する必要があります。Javaの特定のケースのforループでのインクリメントの停止

現在のところ、私のコードは以下のように動作しますが、これを行うためのより良い/より最適化された方法があるかどうかは疑問です。

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--; 
     } 
} 
+0

私によく見えます。 –

答えて

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

このバージョンでは、何をやっている、それは非常に明確になります。

+0

これをお寄せいただきありがとうございました。 - 私はすぐに質問があります。 'Scanner input = new Scanner(System.in)'を関数に入れなければならないと思いますか?あれは正しいですか?あるいは、これを行う別の方法がありますか? – user432584920684

+0

ええ、それはスキャナの正しい場所です。グローバル変数にすることもできますが、これは悪い解決策です。 – Oleksi

+0

助けてくれてありがとう。それは確かに機能が追加されたより多くの 'モジュラー'に見えます! :) – user432584920684

0

ループコードでそのperticular状態。そして、あなたが正確にcolumn--

の場合はまた、あなたは、ループのために、あなたの現在の中で次のように行うことができることをやったようです:

それを行うための方法はかなりだ
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; 

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

ユーザーが無効な入力を何回入力するのかわからないので、これはwhileループを使用する主要な例です。

はこれを試してみてください:input.nextInt()場合ステートメントは、私はnumberに変更された場合は

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(); 
      } 
     } 
} 

はまた、あなたに気づく再びnextInt()を呼び出すと、あなたのスキャナに夢中にどんな入力ストリームから読み込みますので。

関連する問題