回答編集履歴

2 テキスト修正

jun68ykt

jun68ykt score 8907

2015/09/11 18:28  投稿

こんにちは。
入力するテキスト例の最後が、
> 23 33 43
> ... ... ...
> ... ... ...
と書かれていたので、行数は定まっていないと解釈しました。
とすると、aからzまでは26個なので、26行を超えると、何という名前の
変数に入れるのか不明なのですが、ご質問の一番の目的としては
> 23 33 43
のように、半角スペース区切りで数字が並んでいる、テキストファイルの各行から
整数の配列を作る方法を知りたい、ということなのかなと思いました。
この解釈で、StringTokenizerを使って作成したサンプルが以下です。
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Q16077 {
   // 読み込むテキストファイル名
   private static final String INPUT_FILE = "inputs.txt";
   
   public static void main(String[] args) throws IOException {
       
       // 読み込んだ内容を保持するためのリスト
       List<Integer []> resultsList = new ArrayList<Integer []>();
       
       // 入力ストリームを開く
       BufferedReader br = new BufferedReader(new FileReader(INPUT_FILE));
       
       // 各行を読み込むための文字列初期化
       String line = null;
       
       // 各行を読むループ
       while ( (line = br.readLine()) != null ) {
           // 各行の整数を保持するためのリスト初期化
           List<Integer> integersList = new ArrayList<Integer>();
           
           // 読み込んだ行を、スペースで区切ってトークナイザを作成
           StringTokenizer tknzr = new StringTokenizer(line, " ");
           
           // 各トークンについて整数変換を試み、変換できればリストに追加
           while ( tknzr.hasMoreElements() ) {
               String s = tknzr.nextToken();
               try {
                   integersList.add(Integer.parseInt(s));
               } catch (NumberFormatException e) {
                   System.err.println("整数に変換できない文字列:" + s);
               }
           }
           
           // 整数のリストを配列に変換して、読み込み結果を保持するリストに追加
           Integer [] integersArray = integersList.toArray( new Integer[] {});
           resultsList.add(integersArray);
       }
       
       // 入力ストリームを閉じる
       br.close();
       // 結果の表示
       printResults(resultsList);
   }
   // 結果を表示メソッド
   // 結果を表示するメソッド
   private static void printResults(List<Integer []> resultsList)
   {
       final int numLines = resultsList.size();
       
       for ( int i = 0; i < numLines; ++ i ) {
           System.out.print( (i+1) + "行目:");
           Integer[] a = resultsList.get(i);
           for ( int j = 0; j < a.length; ++ j) {
               System.out.print( (j > 0 ? " ":"") + a[j]);
           }
           System.out.println();
       }
   }
}
```
上記のコードで、while の中で行っていることが、**各行から整数の配列を作る**ところになります。
たとえば、入力ファイル、inputs.txt が以下のようなもののとき
> 324 4325 543
> 23 33 43
> 10 20 30 40 50 60
上記のJAVAプログラムを実行すると、以下のように出力されます。
> 1行目:324 4325 543
> 2行目:23 33 43
> 3行目:10 20 30 40 50 60
また上記のプログラムでは、
- 各行のスペースで区切られた数字の文字列が、4個以上でも正しい入力として処理
- 各行のスペースで区切られた文字列の中に、整数に変換できないものがあれば、エラー表示
するようにしています。
以上、ご参考になれば幸いです。
1 テキスト修正

jun68ykt

jun68ykt score 8907

2015/09/11 18:15  投稿

こんにちは。
 
入力するテキスト例の最後が、
> 23 33 43
> ... ... ...
> ... ... ...
と書かれていたので、行数は定まっていないと解釈しました。
とすると、aからzまでは26個なので、26行を超えると、何という名前の
変数に入れるのか不明なのですが、ご質問の一番の目的としては
> 23 33 43
のように、半角スペース区切りで数字が並んでいる、テキストファイルの各行から
整数の配列を作る方法を知りたい、ということなのかなと思いました。
この解釈で、StringTokenizerを使って作成したサンプルが以下です。
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Q16077 {
   // 読み込むテキストファイル名
   private static final String INPUT_FILE = "inputs.txt";
   
   public static void main(String[] args) throws IOException {
       
       // 読み込んだ内容を保持するためのリスト
       List<Integer []> resultsList = new ArrayList<Integer []>();
       
       // 入力ストリームを開く
       BufferedReader br = new BufferedReader(new FileReader(INPUT_FILE));
       
       // 各行を読み込むための文字列初期化
       String line = null;
       
       // 各行を読むループ
       while ( (line = br.readLine()) != null ) {
           // 各行の整数を保持するためのリスト初期化
           List<Integer> integersList = new ArrayList<Integer>();
           
           // 読み込んだ行を、スペースで区切ってトークナイザを作成
           StringTokenizer tknzr = new StringTokenizer(line, " ");
           
           // 各トークンについて整数変換を試み、変換できればリストに追加
           while ( tknzr.hasMoreElements() ) {
               String s = tknzr.nextToken();
               try {
                   integersList.add(Integer.parseInt(s));
               } catch (NumberFormatException e) {
                   System.err.println("整数に変換できない文字列:" + s);
               }
           }
           
           // 整数のリストを配列に変換して、読み込み結果を保持するリストに追加
           Integer [] integersArray = integersList.toArray( new Integer[] {});
           resultsList.add(integersArray);
       }
       
       // 入力ストリームを閉じる
       br.close();
       // 結果の表示
       printResults(resultsList);
   }
   // 結果を表示メソッド
   private static void printResults(List<Integer []> resultsList)
   {
       final int numLines = resultsList.size();
       
       for ( int i = 0; i < numLines; ++ i ) {
           System.out.print( (i+1) + "行目:");
           Integer[] a = resultsList.get(i);
           for ( int j = 0; j < a.length; ++ j) {
               System.out.print( (j > 0 ? " ":"") + a[j]);
           }
           System.out.println();
       }
   }
}
```
上記のコードで、while の中で行っていることが、**各行から整数の配列を作る**ところになります。
たとえば、入力ファイル、inputs.txt が以下のようなもののとき
> 324 4325 543
> 23 33 43
> 10 20 30 40 50 60
上記のJAVAプログラムを実行すると、以下のように出力されます。
> 1行目:324 4325 543
> 2行目:23 33 43
> 3行目:10 20 30 40 50 60
また上記のプログラムでは、
- 各行のスペースで区切られた数字の文字列が、4個以上でも正しい入力として処理する。
- 各行のスペースで区切られた文字列の中に整数に変換できないものがあったときに、エラー表示する。
ようにしています。
- 各行のスペースで区切られた数字の文字列が、4個以上でも正しい入力として処理
- 各行のスペースで区切られた文字列の中に、整数に変換できないものがあれば、エラー表示
するようにしています。
以上、ご参考になれば幸いです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る