テキストファイルを読み込む
テキストファイルを
数値で読み込む
二次方程式の設問をテキストファイルから読み込みます。
テキストファイルを数値で読み込む
なるほど!
テキストだから
計算するには数値に変換
しないとダメっスね。
その通りだ。
ここでは読み込んだ値を
int配列に変換しよう。
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次方程式を解いて表示します。
第二十三章の 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を返します。
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
BufferedReaderは
長くてちょっと覚えにくいけど
コピペでいいから使っていこう。
お疲れ様でした。