テキストファイルを数値で読み込む - 萌えJava超入門
テキストファイルを読み込む

テキストファイルを
数値で読み込む

二次方程式の設問をテキストファイルから読み込みます。


テキストファイルを数値で読み込む


萌えJava超入門 萌えJava超入門
なるほど!
テキストだから
計算するには数値に変換
しないとダメっスね。
萌えJava超入門
その通りだ。
ここでは読み込んだ値を
int配列に変換しよう。

以前に扱った「二次方程式の解を求めるサンプルコード」を例に実践してみましょう。

ご参照↓
第二十三章 多次元配列
 二次方程式の問題集を解くプログラムの解説
  Sample23_10.java


Sample23_10 では、設問の各項の係数を二次元配列のリテラルでプログラム内に記述してきましたが、
今回はテキストファイルに記述してこれを読み込みます。
これならファイルを差し換えれば、違う問題も解けますね。

処理対象が書き込まれたファイルを読み込む」例です。

ここでは以下の問題を解きましょう。

  
次の2次方程式を解きなさい 1. x2 - 8x + 9 =0 2. x2 +16x + 58 =0 3. x2 -10x + 1 =0 4 x2 +28x +142 =0 5. 3x2 -30x + 51 =0 6. 4x2 +24x + 28 =0 7. x2 - 1x - 1 =0 8. 9x2 +18x + 2 =0
読み込むファイルは、各項の係数を記した CSVファイルです。
1,-8,9
1,16,58
1,-10,1
1,28,142
3,-30,51
4,24,28
1,-1,-1
9,18,2

Sample06_01.javaクラス と ReadFile_03クラス に分けています。
同じフォルダに保存して実行してください。
テキストファイルの読込と変換は、ReadFile_03クラスの toIntArray2Dメソッドで行っています。
Sample06_01.javaクラスは、2次方程式を解いて表示します。

萌えJava超入門 萌えJava超入門
第二十三章の Sample23_10.java の
int[][] coefficient
ファイルから読み込んだんだよ。
//Sample06_01.java

import java.io.File;

class Sample06_01 {

  /*素数*/
  static int[] primeNums = {2, 3, 5, 7, 11, 13};

  static double[] method_04(double a, double b, double c){
      /*各パートの計算*/
      double[] ans = {(2*a) , -b ,  (b*b-4*a*c)};
      return ans;
  }
  static double[] reduce(double[] ans){
      /*約分*/
      for(int i=0; i< primeNums.length; i++){
          if(ans[0] >= primeNums[i]){
            while(
              ans[0]%primeNums[i] == 0 &&
              ans[1]%primeNums[i] == 0 &&
              ans[2]%(primeNums[i]*primeNums[i]) == 0
              ){
                ans[0]/=primeNums[i];
                ans[1]/=primeNums[i];
                ans[2]/=(primeNums[i]*primeNums[i]);
            }
          }
      }
      return ans;
  }
  static void printAnswer(double[] ans){
      /*答えの表示*/
      double partA = ans[0];
      double partB = ans[1];
      double partC = ans[2];

      System.out.println("          " + partB + "  ±√( "+ partC +" )");
      System.out.println("    x = -------------------------");
      System.out.println("                " + partA);
  }
  public static void main(String[] args){

      /*第二十三章 多次元配列の Sample23_10.java を
      ここだけ書き換えました。↓↓↓↓↓↓↓↓*/
      File file = new File("q1_axx_bx_c_0.csv");
      int[][] coefficient = ReadFile_03.toIntArray2D(file, "UTF-8", ",");
      /*↑↑↑↑↑↑↑*/

      for(int i=0; i<coefficient.length; i++){

          int[] line = coefficient[i];
          int a = line[0];
          int b = line[1];
          int c = line[2];

          System.out.println(
              (i+1) + ". " + (int)a + "xx+" + (int)b +"x+" +(int)c +"=0"
          );

          double[] ans = method_04(a, b, c);

          ans = reduce(ans);

          printAnswer(ans);
     }
  }
}
読込がうまくいかない場合は NullPointerException になります。



class ReadFile_03クラスの toIntArray2Dメソッドは、CSVファイルの値を int配列で返します。
変換できない文字があった場合には、nullを返します。
萌えJava超入門 萌えJava超入門
int配列に変換すれば
数値として計算できるぞ。
//ReadFile_03.java

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

class ReadFile_03{
  public static int[][] toIntArray2D(
              File inputFile,
              String encoding,
              String delimiters
  ){
      int[][] array2D = null;

      ArrayList<String> list = fileToList(inputFile, encoding);

      if(list!=null){
          array2D = new int[list.size()][];
          for(int i=0; i< list.size(); i++){
              String[] strArray = list.get(i).split(delimiters);
              int[] intArray = new int[strArray.length];
              try{
                  for(int j=0; j< strArray.length; j++){
                      //要素を一つずつ intに変換
                      intArray[j] = Integer.parseInt(strArray[j]);
                  }
                  array2D[i] = intArray;//一次元配列を二次元配列の要素として代入
              }catch(NumberFormatException e){
                  e.printStackTrace();
                  return null;
              }
          }
      }else{
          return null;
      }
      return array2D;
  }

  public static ArrayList<ArrayList<String>> toStringList2D(
              File inputFile,
              String encoding,
              String delimiters
  ){
      ArrayList<ArrayList<String>> List2D = null;

      ArrayList<String> list = fileToList(inputFile, encoding);
      if(list!=null){
          List2D = new ArrayList<ArrayList<String>>();
          for(int i=0; i< list.size(); i++){
              String[] line = list.get(i).split(delimiters);
              List2D.add(new ArrayList<String>(Arrays.asList(line)));
          }
      }else{
          return null;
      }
      return List2D;
  }

  public static String[][] toStringArray2D(
              File inputFile,
              String encoding,
              String delimiters
  ){
      String[][] array2D = null;

      ArrayList<String> list = fileToList(inputFile, encoding);
      if(list!=null){
          array2D = new String[list.size()][];
          for(int i=0; i< list.size(); i++){
              array2D[i] = list.get(i).split(delimiters);
          }
      }else{
          return null;
      }
      return array2D;
  }

  public static ArrayList<String> fileToList(
              File inputFile,
              String encoding
  ){
      ArrayList<String> list = null;
      try {
          //ファイルの読込
          BufferedReader br = new BufferedReader(
                  new InputStreamReader(
                      new FileInputStream(inputFile), encoding
                  )
          );

          list = new ArrayList<String>();
          String strLine;
          while((strLine = br.readLine()) != null) {

              list.add(strLine);
          }
          br.close();
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (IOException e){
          e.printStackTrace();
      } catch (NumberFormatException e){
          e.printStackTrace();
          return null;
      }
      return list;
  }
}
グレーの部分は、今回は使っていません。

コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample06_01.java
ws>java Sample06_01
1. 1xx+-8x+9=0
          4.0  ±√( 7.0 )
    x = -------------------------
                1.0
2. 1xx+16x+58=0
          -8.0  ±√( 6.0 )
    x = -------------------------
                1.0
3. 1xx+-10x+1=0
          5.0  ±√( 24.0 )
    x = -------------------------
                1.0
4. 1xx+28x+142=0
          -14.0  ±√( 54.0 )
    x = -------------------------
                1.0
5. 3xx+-30x+51=0
          5.0  ±√( 8.0 )
    x = -------------------------
                1.0
6. 4xx+24x+28=0
          -3.0  ±√( 2.0 )
    x = -------------------------
                1.0
7. 1xx+-1x+-1=0
          1.0  ±√( 5.0 )
    x = -------------------------
                2.0
8. 9xx+18x+2=0
          -3.0  ±√( 7.0 )
    x = -------------------------
                3.0


萌えJava超入門 萌えJava超入門
萌えJava超入門
BufferedReaderは
長くてちょっと覚えにくいけど
コピペでいいから使っていこう。


お疲れ様でした。




© 2019 awasekagami