2016-11-21 13 views
0

このプログラムの目標は、というダブルタイプの配列に保存する、入力テキストファイルの数字をseatPrices.txtとして保存することです。Java - 入力ファイルの数値を2次元配列に格納する

入力ファイルは次のとおりです。

310:300:320:320:300:310 
360:350:370:370:350:360 
360:350:370:370:350:360 
360:350:370:370:350:360 
360:350:370:370:350:360 
260:250:270:270:250:260 
260:250:270:270:250:260 
260:250:270:270:250:260 
260:250:270:270:250:260 
260:250:270:270:250:260 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
210:200:220:220:200:210 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 
110:100:120:120:100:110 

このための私のコードは次のとおりです。

import java.io.FileReader; 
import java.util.Scanner; 
import java.io.IOException; 

public class testAirline { 

    // initializing variables and arrays 
    private static final int MAX_COLUMN = 6; 
    private static final int MAX_ROW = 30; 
    double[][] priceArray; 
    FileReader fr; 
    Scanner scan; 

    // this constructor reserves memory for arrays and sets the filereader and scanner variables, then call "start" method 
    public void Airline() throws IOException {  
     priceArray = new double[MAX_ROW][MAX_COLUMN]; 
     fr = new FileReader(seatPrices); 
     scan = new Scanner(fr).useDelimiter(":"); 
     start(); 
    } 

    // fills the priceArray with numbers from seatPrices.txt 
    private void start() { 
     for (int i = 0; i < MAX_ROW; i++) { 
      for (int j = 0; j < MAX_COLUMN; j++) { 
       priceArray[i][j] = scan.nextDouble(); 
      } 
     } 
    } 
} 

私はこれを実行すると、私はコンソールに次のエラーを取得:

Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:864) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextDouble(Scanner.java:2413) 
    at testAirline.start(Airline.java:19) 
    at testAirline.Airline(Airline.java:12) 

だから私が "start"メソッド(start())を呼んだときとその数字がスキャンされたとき配列に格納されるファイルから削除します。私はなぜこれらのエラーがスローされているのか分かりません。私はdelimiterを初めて使用しているので、これらの問題は適切にフォーマットしていないことに起因すると考えられましたが、このコードでエラーがスローされた行を見つけたときに疑わしいものが見つかりました。

ここで私のプログラムで働いていた答えは見つかりませんでした。私はすべての可能な解決策に開放されています!すべての助けをいただければ幸いです!

編集:ロバートの提案コード@から

出力:

:0,0 : 310.0 
:0,1 : 300.0 
:0,2 : 320.0 
:0,3 : 320.0 
:0,4 : 300.0 
:1,0 : 360.0 
:1,1 : 350.0 
:1,2 : 370.0 
:1,3 : 370.0 
:1,4 : 350.0 
:2,0 : 360.0 
:2,1 : 350.0 
:2,2 : 370.0 
:2,3 : 370.0 
:2,4 : 350.0 
:3,0 : 360.0 
:3,1 : 350.0 
:3,2 : 370.0 
:3,3 : 370.0 
:3,4 : 350.0 
:4,0 : 360.0 
:4,1 : 350.0 
:4,2 : 370.0 
:4,3 : 370.0 
:4,4 : 350.0 
:5,0 : 260.0 
:5,1 : 250.0 
:5,2 : 270.0 
:5,3 : 270.0 
:5,4 : 250.0 
:6,0 : 260.0 
:6,1 : 250.0 
:6,2 : 270.0 
:6,3 : 270.0 
:6,4 : 250.0 
:7,0 : 260.0 
:7,1 : 250.0 
:7,2 : 270.0 
:7,3 : 270.0 
:7,4 : 250.0 
:8,0 : 260.0 
:8,1 : 250.0 
:8,2 : 270.0 
:8,3 : 270.0 
:8,4 : 250.0 
:9,0 : 260.0 
:9,1 : 250.0 
:9,2 : 270.0 
:9,3 : 270.0 
:9,4 : 250.0 
:10,0 : 210.0 
:10,1 : 200.0 
:10,2 : 220.0 
:10,3 : 220.0 
:10,4 : 200.0 
:11,0 : 210.0 
:11,1 : 200.0 
:11,2 : 220.0 
:11,3 : 220.0 
:11,4 : 200.0 
:12,0 : 210.0 
:12,1 : 200.0 
:12,2 : 220.0 
:12,3 : 220.0 
:12,4 : 200.0 
:13,0 : 210.0 
:13,1 : 200.0 
:13,2 : 220.0 
:13,3 : 220.0 
:13,4 : 200.0 
:14,0 : 210.0 
:14,1 : 200.0 
:14,2 : 220.0 
:14,3 : 220.0 
:14,4 : 200.0 
:15,0 : 210.0 
:15,1 : 200.0 
:15,2 : 220.0 
:15,3 : 220.0 
:15,4 : 200.0 
:16,0 : 210.0 
:16,1 : 200.0 
:16,2 : 220.0 
:16,3 : 220.0 
:16,4 : 200.0 
:17,0 : 210.0 
:17,1 : 200.0 
:17,2 : 220.0 
:17,3 : 220.0 
:17,4 : 200.0 
:18,0 : 210.0 
:18,1 : 200.0 
:18,2 : 220.0 
:18,3 : 220.0 
:18,4 : 200.0 
:19,0 : 210.0 
:19,1 : 200.0 
:19,2 : 220.0 
:19,3 : 220.0 
:19,4 : 200.0 
:20,0 : 110.0 
:20,1 : 100.0 
:20,2 : 120.0 
:20,3 : 120.0 
:20,4 : 100.0 
:21,0 : 110.0 
:21,1 : 100.0 
:21,2 : 120.0 
:21,3 : 120.0 
:21,4 : 100.0 
:22,0 : 110.0 
:22,1 : 100.0 
:22,2 : 120.0 
:22,3 : 120.0 
:22,4 : 100.0 
:23,0 : 110.0 
:23,1 : 100.0 
:23,2 : 120.0 
:23,3 : 120.0 
:23,4 : 100.0 
:24,0 : 110.0 
:24,1 : 100.0 
:24,2 : 120.0 
:24,3 : 120.0 
:24,4 : 100.0 
:25,0 : 110.0 
:25,1 : 100.0 
:25,2 : 120.0 
:25,3 : 120.0 
:25,4 : 100.0 
:26,0 : 110.0 
:26,1 : 100.0 
:26,2 : 120.0 
:26,3 : 120.0 
:26,4 : 100.0 
:27,0 : 110.0 
:27,1 : 100.0 
:27,2 : 120.0 
:27,3 : 120.0 
:27,4 : 100.0 
:28,0 : 110.0 
:28,1 : 100.0 
:28,2 : 120.0 
:28,3 : 120.0 
:28,4 : 100.0 
:29,0 : 110.0 
:29,1 : 100.0 
:29,2 : 120.0 
:29,3 : 120.0 
:29,4 : 100.0 

答えて

1

さらに有益なエラー出力を追加することで、不具合の捜索を支援することができます。

private void start() { 
    for (int i = 0; i < MAX_ROW; i++) { 
     for (int j = 0; j < MAX_COLUMN; j++) { 
      try { 
       priceArray[i][j] = scan.nextDouble(); 
      } catch (Exception e) { 
       System.err.println("Error discovered at " + i + "," + j ": " + e); 
      } 
     } 
    } 
} 

これは、入力が悪い行/列を表示します。

次のようなエラーが表示されます:スキャナが行の終わりを超えて起こっていることをあなたに示す必要があり

Error discovered at 0,5: java.util.InputMismatchException 

を。あなたはnextDouble()にあなたの電話を保護する必要があります。

   if (scan.hasNextDouble()) { 
        priceArray[i][j] = scan.nextDouble(); 
        System.out.println(":" + i + "," + j + " : " + priceArray[i][j]); 
       } 

ます。また、行ごとに次の行に進めるために必要があります:

 if (scan.hasNextLine()) { 
      scan.nextLine(); 
     } 

次改訂start()機能が正しく入力を解析する必要があります。

// fills the priceArray with numbers from seatPrices.txt 
private void start() { 
    for (int i = 0; i < MAX_ROW; i++) { 
     for (int j = 0; j < MAX_COLUMN; j++) { 
      try { 
       if (scan.hasNextDouble()) { 
        priceArray[i][j] = scan.nextDouble(); 
        System.out.println(":" + i + "," + j + " : " + priceArray[i][j]); 
       } 
      } catch (Exception e) { 
       System.err.println("Error discovered at " + i + "," + j + ": " + e); 
      } 
     } 
     if (scan.hasNextLine()) { 
      scan.nextLine(); 
     } 
    } 
} 
+0

これを実装した後、値が0〜29行目と0〜4行目に格納されていることに気付きました。私は、文字制限のため、私の元の質問に出力を掲載しました。私は印刷された値を見直し、入力ファイルの第6列全体が省略され、配列から6列目の印刷がないことを発見しました。 'Error found at ...'というメッセージは表示されませんでした。私はそれがjの 'for'ループの問題だと考えましたが、j <6まで実行するように設定しましたので、6番目の列があるはずです。それ以外はうまくいった。なぜ6番目の列は省略されますか? – ccbadger

+0

**更新:** 'j ccbadger

+0

まあまあです。_ "完全なトークンの前に区切りパターンに一致する入力が続きます" _ https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#next() - 私はこの問題に、区切り文字パターンに行区切り文字を含めることで対処できました: 'useDelimiter(" [:\ n \ r] + ")' - これは理想的ではありませんが、Scanner APIは代替。 – robert

1

パブリッククラスInputMismatchException は、検索されたトークンがためのパターンと一致しないことを示すために、スキャナによってスローはNoSuchElementException を拡張またはトークンが予想される型の範囲外であることを示します。

priceArray [i] [j] = Double.parseDouble(scan.next());

+0

残念ながら、 'scan.nextDouble'を' Double.parseDouble(scan.next()) 'に変更したのと同じエラーが発生しました。好奇心のために、double.stopを格納するときに 'scan.next()'はどのように振る舞いますか?私はいつも 'scan.next()'が文字列を格納するために予約されていることを学校で教えていました。 – ccbadger

1

あなたはScannerクラスのJavaドキュメントを確認した場合、それは

、と述べています

次のトークンが有効double値に変換できない場合InputMismatchExceptionをスローしますnextDouble()方法。 の変換に成功すると、スキャナは と一致する入力を超えて進みます。 \n .i.e新しい行に遭遇したときに、あなたのコード内であなたは、:にコードブレークの区切り文字を設定している、が

。したがって、タイプdoubleの2次元マトリックス内のデータを格納するためのコードを作るためにあなたのスキャナを変更してみてください:

Scanner sc = new Scanner(new FileInputStream(new File(pathOfInpFile));

とにstart()方法であなたのforループを変更:

for(int row = 0; row < rowcount; row++){ 
       //Read each line. No. of lines will be equal to the no. of rows in file. 
       String eachLine = sc.nextLine(); 
       /* 
       * Split each line at ':'. This gives you a String array of 
       * length equal to no. of columns in file. 
       */ 
       String[] columnData = eachLine.split(":"); 
       for(int col = 0; col < colCount; col++){ 
        //Now, store data in your matrix. 
        data[row][col] = Double.parseDouble(columnData[col]); 
       } 
      } 

Iこれがあなたの問題を解決することを願ってください。

+0

これまでのところ、私はこの仕事を私のためにすることができませんでした。簡単な質問: 'Scanner sc = new Scanner(fr);'(ここで、 'fr'はFileReader変数です)を実行すると、' Scanner sc = new Scanner(新しいFileInputStream(新しいファイルpathOfFile) ) – ccbadger

+1

FileReaderまたはInputStreamReaderを使用することができます。そのことを強調したかったのですが、区切り文字を指定せずに、各行を読み込んで分割することができます。 –

+0

ああ、少し混乱しました明確化と助けをありがとう! – ccbadger

関連する問題