2017-02-20 9 views
1

私がやっていることは、ファイルを読み込んでデータを配列に格納することです。ファイル内の各行の数値に応じて選択する配列。私はインデックスの範囲外に出てくる。私は何をやっているのですか?ファイルを読み込んで複数の配列にデータを格納する際にエラーが発生する

私が読んでいるファイルは、このようなものです。

>2.0 5.0 3.5 
> 
>5.2 0.5 4.8 
> 
>1.0 
> 
>2.5 

ボックス配列内に3つの番号を持つ行を、ボール配列の内部に1つの番号を持つ行を格納します。しかし、これらの配列だけでなく、配列に任意の量の行を格納できるようにしたい。


これはこれまでのコードです。

import java.io.*; 

public class MainProg{ 
    public static void main(String[] args) throws IOException{ 
     FileReader fr = new FileReader("info.txt"); 
     BufferedReader br = new BufferedReader(fr); 
     String nums; 
     int count =0; 
     int lineNo = 0; 


     while((nums = br.readLine()) != null){  
      String numbers[] = nums.split(" "); 
      double[][] ball = new double[lineNo][]; 
      if(numbers.length == 3){ 
       for(int i = 0; i < numbers.length; i++){ 
        double[][] box = new double[lineNo][i]; 
        box[lineNo][i] = Double.parseDouble(numbers[lineNo]); 

        lineNo++; 

        System.out.println(box[i] + " "); 
       } 
      }else{ 
       while(numbers.length == 1 && ((nums = br.readLine()) != null)){ 
        int p = 0; 
        ball[count][p] = Double.parseDouble(numbers[count]); 
        p++; 
        count++; 
       } 
      } 
     } 
    } 
} 

私はオブジェクトの配列でこれを行うことになっていますが、私はこの方法を最初に行う方法を理解したいと思います。

+0

「p」は、ハードコードされた「0」で置き換えることができます。はい、 'p'は時々' 1'にインクリメントされますが、その値はスコープから外れる前には決して読み込まれません。 –

+0

また、あなたの入力ファイルに本当にそれらの '>'文字が含まれているのですか、またはブロッククォートフォーマットの試みでしたか? –

答えて

1

コードにはいくつかの論理的な問題があります。

lineNoiの値が0の場合、次の行はどういう意味ですか?なぜあなたはwhileループの代わりにforループ内の変数lineNoを増やしている

double[][] ball = new double[lineNo][]; 
double[][] box = new double[lineNo][i]; 

(考えてみますか)?

for(int i = 0; i < numbers.length; i++){ 
    ... 
    lineNo++; 
    ... 
} 

elseブロック内whileループがあるのはなぜ?

while(numbers.length == 1 && ((nums = br.readLine()) != null)){ 
    int p = 0; 
    ball[count][p] = Double.parseDouble(numbers[count]); 
    p++; 
    count++; 
} 

は、なぜあなたは BufferedReader brを使用して、この whileループの中で読んでいますか?これらは意味をなさない。

その他の問題、あなたが入力の例で提供されているように、

  • は、あなたの入力は空行が含まれていていますか?
  • ボールとボックスの配列に値を格納したいが、入力ファイルに何行あるのか分からない?次に、サイズを知らずに配列を作成する方法はありますか?むしろArrayListを使用して作業を行うことをお勧めします。

たとえば、次のようなことができます。私はあなたの入力ファイルを想定しています

BufferedReader br = new BufferedReader(new FileReader("info.txt")); 
ArrayList<Double> ball = new ArrayList<>(); 
ArrayList<Double[]> box = new ArrayList<>(); 

String nums; 
while((nums = br.readLine()) != null){  
    String numbers[] = nums.split(" "); 
    if(numbers.length == 3){ 
     Double[] box_row = new Double[numbers.length]; 
     for(int i = 0; i < numbers.length; i++){ 
      box_row[i] = Double.parseDouble(numbers[i]); 
     } 
     box.add(box_row); 
    }else if(numbers.length == 1){ 
     ball.add(Double.parseDouble(numbers[0])); 
    } 
} 

System.out.println("Box Array"); 
for(Double[] element: box){ 
    System.out.println(Arrays.toString(element)); 
} 
System.out.println("Ball Array"); 
System.out.println(ball.toString()); 

には空行なし>文字が含まれていません。上記のコードスニペットは、以下を出力します。

Box Array 
[2.0, 5.0, 3.5] 
[5.2, 0.5, 4.8] 
Ball Array 
[1.0, 2.5] 
+0

関連するノートで、なぜ「ボール」、特に「ボックス」が投げ捨てられ、何度も何度も再現されていますか?彼らは何かを保管しようとしていたように見えます。 –

+0

私は、OPが彼がやっていることを正しく理解していないと信じています! –

+0

ありがとう、あなたの返信は本当に役に立ちます。 –

関連する問題