2016-05-16 8 views
1

このコードはプレーンテキストファイルから各行を読み込みます(各行は整数の配列の "リスト"を持ちます)。一時配列に格納されます。文書の各行は、同じ数の行と列を持つ2次元配列に配置する必要があります。Javaの "break"は両方のループのネストされていないようです

"if"ステートメントを使用して条件をテストするコード行は、内部forループのみを中断し、外側に戻ってiをインクリメントし、その行の次の配列に移動することになっています。

これまでのコードでは、各行で最初の配列のみを取り出し、2次元配列の最初の行に配置しますが、その行の他の配列をすべてスキップして次の行に移動します。それは同じことをします。したがって、内部ループは1回進みますが、外部ループは決して増加しません。私が読んだすべての記事では、ネストされたforループの "break"は内部ループを終了するだけであると言います。このような状況ではそうは思われません。

したがって、外側のループがインクリメントされ、行のすべての配列が考慮されていることを確認するにはどうすればよいですか?例えば

if (!thisLine.equals("*")) { 
       String [] firstSplit = thisLine.split(" "); 
       String [] secondSplit = new String [firstSplit.length * firstSplit.length]; 
       int [][] numbers = new int [firstSplit.length][firstSplit.length]; 
       int value = 0; 
       int count = 0; 
       for (int i = 0; i < firstSplit.length; i++) { 
        firstSplit[i] = firstSplit[i].replace("[", "").replace("]", ""); 
        secondSplit = firstSplit[i].split(","); 
        for (int j = 0; j < secondSplit.length; j++) { 
         value = Integer.parseInt(secondSplit[j]); 
         if (count >= firstSplit.length) { 
          break; 
         } 
         numbers[i][count] = value; 
         count++; 
         System.out.println(value); 
        } 
       } 
       System.out.println(Arrays.deepToString(numbers)); 
      } 

:読み込むファイルの行がある: が[6,10,15,13] [16,2,14,7] [11,8,9,3] [5 、4,1,12]

'firstSplit'は、空白で行を分割し、長さ4の配列を作成します。 その後、角かっこが削除されます。 firstSplitの各項目について、secondSplitはコンマで区切り、長さ16(個々の整数)の配列を作成します。 secondSplitの各項目は、整数に変換され、次のような配列に配置されます。 [0] [0]に6、[0] [1]に10、[0] [2]に15、 0] [3]。

次の配列[16、2、14、7]は完全に無視されます。

答えて

9

あなたはをリセットすることはありませんので、それがfirstSplit.lengthより高くなると、それ以降のすべての繰り返しはすぐにbreakになります。

countの初期化を最も外側のforループの内側に移動する必要があります。その結果、内側のループのたびに0にリセットされます。

あなたが見ている問題を修正するはずですが、そこにはいくつかの改善点があります。最初の宣言は、使用する前に常に新しい値(firstSplit[i].split(","))を割り当てるため、secondSplitの宣言は不要です。私はその宣言を削除し、外側のループ内の行をString[] secondSplit = firstSplit[i].split(",");に変更することをお勧めします。これは、不必要にメモリのチャンクを割り当てることを避けるでしょう。

第2に、目標を理解していない限り、配列の幅が高さと異なる場合に問題が発生します。 countが必要なのは、numbers[i]の長さを実際のサイズではなくfirstSplit.lengthに初期化するためです。私はこれまで、あなたのコードを変更したい:

String [] firstSplit = thisLine.split(" "); 
int [][] numbers = new int [firstSplit.length][]; 
for (int i = 0; i < firstSplit.length; i++) { 
    firstSplit[i] = firstSplit[i].replace("[", "").replace("]", ""); 
    String[] secondSplit = firstSplit[i].split(","); 
    numbers[i] = new int[secondSplit.length]; 

    for (int j = 0; j < secondSplit.length; j++) { 
     int value = Integer.parseInt(secondSplit[j]); 
     numbers[i][j] = value; 
     System.out.println(value); 
    } 
} 

は、今では彼らだけが実際に必要としている変数を宣言し、彼らが必要とするサイズになるように、内側の配列を設定しています。

+1

これはいいキャッチです:) –

+0

これは私が見つけられなかった非常に簡単な解決策でした!私はそれがjavaに新しいです。ありがとうございました。 – galaxyphoenix67

+0

@ galaxyphoenix67うれしかった。あなたのコードをよりきれいにし、壊れにくい提案を投稿にいくつか追加しました(あなたの意図を正しく理解していることを前提にしています。 – resueman

関連する問題