質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1119閲覧

[java初心者]「テキストファイルから行列データを読み込み二次元配列に保存したものを表示する」プログラムでのエラー

soft_cream

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/07/04 07:20

編集2021/07/05 08:44

追記2
教えていただいたことを参考に
getterやsetterを書き加えました
まだ正しく記述できておらず、コンパイルエラーが出ている状態のため
修正の方法についてお聞きしたいです

追記1
最初に質問した内容(上のプログラムについて)は回答していただいた方のおかげで解決しました。
続けて質問させていただくために修正後のプログラムを最初のプログラムの下に追加させていただきました。
修正後のプログラムには以下のようなエラーが表示されました。
ーーーーーーーーーーーーーーーーー
Matrix.java:39: エラー: シンボルを見つけられません
matrix.print();
^
シンボル: メソッド print()
場所: タイプdouble[][]の変数 matrix
Matrix.java:74: エラー: 不適合な型: Matrixをdouble[][]に変換できません:
A = y.read(args[0]);
^
Matrix.java:76: エラー: 不適合な型: Matrixをdouble[][]に変換できません:
B = z.read(args[1]);
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

※以下最初の質問の内容

「テキストファイルから行列データを読み込み二次元配列に保存したものを表示する」プログラムを作成、
コンパイルしたところ
以下のようなエラーメッセージが表示されました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Matrix.java:26: エラー: '.class'がありません
while (int M=0 < row && (line = br.readLine()) != null){
^
Matrix.java:26: エラー: ';'がありません
while (int M=0 < row && (line = br.readLine()) != null){
^
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これはどのような原因が考えられるでしょうか?

テキストファイルの例
3 3 ←行と列の数を表す
0.11 0.03 0.1 ←以下行列の要素
0.2 0.22 0.66
0.4 0.56 0.09

getRow、getColumメソッドにより指定されたファイルから1行読み込み、行と列の数を取得する
readメソッドにより以降の行も順に読んでいき、二次元配列に保存する
printメソッドにより表示を行う
といった流れのプログラムです

JDK8を使用しています

java

1//最初の質問に関するプログラム 2import java.io.*; 3public class Matrix{ 4 private int row,col; 5 public Matrix(); 6 public Matrix(int M,int N){ 7 this.row=M; 8 this.col=N; 9 } 10 private double[][] matrix = new double [row][col]; 11 public int getRow(String filename){ 12 BufferedReader br = new BufferedReader(new FileReader(fileName)); 13 String[] M = br.split("\s"); 14 int m = Integer.parseInt(M[0]); 15 return m; 16 } 17 public int getColumn(String filename){ 18 BufferedReader br = new BufferedReader(new FileReader(fileName)); 19 String[] N = br.split("\s"); 20 int n = Integer.parseInt(N[1]); 21 return n; 22 } 23 public Matrix read(String filename){ 24 try (BufferedReader br = new BufferedReader(new FileReader(filename))){ 25 String[] rowcol = br.readLine().split(" "); 26 String line = null; 27 while (int M=0 < row && (line = br.readLine()) != null){ 28 String[] record = line.split(" "); 29 for (int N = 0; N < col ; N++) { 30 matrix[M][N] = Double.parseDouble(record[N]); 31 } 32 M++; 33 } 34 matrix.print(); 35 } 36 catch (FileNotFoundException e) { 37 e.printStackTrace(); 38 } 39 catch (IOException e) { 40 e.printStackTrace(); 41 } 42 catch (NumberFormatException e) { e.printStackTrace(); 43 } 44 } 45 public void print(){ 46 for (double[] record : matrix) { 47 for (double d : record) { 48 System.out.print(d + " "); 49 } 50 System.out.println(); 51 } 52 } 53 public static void main(String[] args){ 54 if (args.length != 2) { 55 System.out.println("need two files"); System.exit(1); 56 } 57 int arow,acol,brow,bcol; 58 Matrix x = new Matrix(); 59 arow=x.getrow(args[0]); 60 acol=x.getColumn(args[0]); 61 brow=x.getrow(args[1]); 62 bcol=x.getColumn(args[1]); 63 double [ ][ ] A = new double [arow][acol]; 64 double [ ][ ] B = new double [brow][bcol]; 65 double [ ][ ] C = new double [acol][brow]; 66 Matrix x = new Matrix(arow,acol); 67 Matrix A = x.read(args[0]); 68 Matrix x = new Matrix(brow,bcol); 69 Matrix B = x.read(args[1]); 70 } 71}

java

1//次の質問に関するプログラム 2import java.io.*; 3import java.io.FileInputStream; 4import java.io.InputStreamReader; 5public class Matrix{ 6 private int row,col; 7 public Matrix(){ 8 } 9 public Matrix(int M,int N){ 10 this.row=M; 11 this.col=N; 12 } 13 private double[][] matrix = new double [row][col]; 14 public int getRow(String filename){ 15 BufferedReader br = new BufferedReader(new FileReader(filename)); 16 String rline = br.readLine(); 17 String[] R = rline.split("\s"); 18 int m = Integer.parseInt(R[0]); 19 return m; 20 } 21 public int getColumn(String filename){ 22 BufferedReader br = new BufferedReader(new FileReader(filename)); 23 String cline = br.readLine(); 24 String[] C = cline.split("\s"); 25 int n = Integer.parseInt(C[1]); 26 return n; 27 } 28 public Matrix read(String filename){ 29 try (BufferedReader br = new BufferedReader(new FileReader(filename))){ 30 String[] rowcol = br.readLine().split(" "); 31 String line = null; 32 int M=0; 33 while (M < row && (line = br.readLine()) != null){ 34 String[] record = line.split(" "); 35 for (int N = 0; N < col ; N++) { 36 matrix[M][N] = Double.parseDouble(record[N]); 37 } 38 M++; 39 } 40 matrix.print(); 41 } 42 catch (FileNotFoundException e) { 43 e.printStackTrace(); 44 } 45 catch (IOException e) { 46 e.printStackTrace(); 47 } 48 catch (NumberFormatException e) { 49 e.printStackTrace(); 50 } 51 } 52 public void print(){ 53 for(int i = 0; i<row; i++){ 54 for(int j = 0; j<col; j++){ 55 System.out.println(matrix[i][j]); 56 } 57 } 58 59 } 60 public static void main(String[] args){ 61 if (args.length != 2) { 62 System.out.println("need two files"); 63 System.exit(1); 64 } 65 int arow,acol,brow,bcol; 66 Matrix x = new Matrix(); 67 arow=x.getRow(args[0]); 68 acol=x.getColumn(args[0]); 69 brow=x.getRow(args[1]); 70 bcol=x.getColumn(args[1]); 71 double [ ][ ] A = new double [arow][acol]; 72 double [ ][ ] B = new double [brow][bcol]; 73 double [ ][ ] C = new double [acol][brow]; 74 Matrix y = new Matrix(arow,acol); 75 A = y.read(args[0]); 76 Matrix z = new Matrix(brow,bcol); 77 B = z.read(args[1]); 78 } 79}

java

1//getterやsetterを利用した形 2import java.io.*; 3import java.io.FileInputStream; 4import java.io.InputStreamReader; 5public class Matrix{ 6 private int row,col; 7 public Matrix(){ 8 } 9 public Matrix(int M,int N){ 10 this.row=M; 11 this.col=N; 12 } 13 private double[][] matrix = new double [row][col]; 14 public int getRow(String filename){ 15 BufferedReader br = new BufferedReader(new FileReader(filename)); 16 String rline = br.readLine(); 17 String[] R = rline.split("\s"); 18 int m = Integer.parseInt(R[0]); 19 return m; 20 } 21 public int getColumn(String filename){ 22 BufferedReader br = new BufferedReader(new FileReader(filename)); 23 String cline = br.readLine(); 24 String[] C = cline.split("\s"); 25 int n = Integer.parseInt(C[1]); 26 return n; 27 } 28 public Matrix read(String filename){ 29 try (BufferedReader br = new BufferedReader(new FileReader(filename))){ 30 String[] rowcol = br.readLine().split(" "); 31 String line = null; 32 int M=0; 33 while (M < row && (line = br.readLine()) != null){ 34 String[] record = line.split(" "); 35 for (int N = 0; N < col ; N++) { 36 matrix[M][N] = Double.parseDouble(record[N]); 37 } 38 M++; 39 } 40 print(); 41 } 42 catch (FileNotFoundException e) { 43 e.printStackTrace(); 44 } 45 catch (IOException e) { 46 e.printStackTrace(); 47 } 48 catch (NumberFormatException e) { 49 e.printStackTrace(); 50 } 51 } 52 public void print(){ 53 for(int i = 0; i<row; i++){ 54 for(int j = 0; j<col; j++){ 55 System.out.println(matrix[i][j]); 56 } 57 } 58 } 59 public void setmatrix(double[][] MAT) { 60 MAT=this.matrix; 61 } 62 public double[][] getmatrix(){ 63 return MAT; 64 } 65 public void main(String[] args){ 66 if (args.length != 2) { 67 System.out.println("need two files"); 68 System.exit(1); 69 } 70 int arow,acol,brow,bcol; 71 Matrix x = new Matrix(); 72 arow=x.getRow(args[0]); 73 acol=x.getColumn(args[0]); 74 brow=x.getRow(args[1]); 75 bcol=x.getColumn(args[1]); 76 double [ ][ ] A = new double [arow][acol]; 77 double [ ][ ] B = new double [brow][bcol]; 78 double [ ][ ] C = new double [acol][brow]; 79 Matrix y = new Matrix(arow,acol); 80 y.read(args[0]); 81 y.setmatrix(A); 82 A=matrix; 83 Matrix z = new Matrix(brow,bcol); 84 z.read(args[1]); 85 z.setmatrix(B); 86 B=matrix; 87 } 88}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/07/05 09:35

追記される新たな質問を読んで:(※回答した当事者ではないのですが、気になったので) 最初の質問に関してはいただいた回答で解決したと思うのですけど、それを解決することで新たな問題が出て、全て解決するまでこの質問は終わらないということなのでしょうか。それはちょっとマナー的にどうなのか、と思いますがいかがでしょうか。
guest

回答3

0

行列データの読み込みは書いたので、
読み込んだ 2つの行列データの掛け算は自分で書いてください。

Java

1import java.io.*; 2 3public class Matrix { 4 private int row, col; 5 private double[][] matrix; 6 7 public Matrix() {} 8 9 public Matrix(Matrix a, Matrix b) { 10 if (a.col != b.row) return; 11 row = a.row; 12 col = b.col; 13 matrix = new double[row][col]; 14 // ここで matrix[i][j] に a * b の結果を入れる 15 } 16 17 public void read(String filename) { 18 try (BufferedReader br = new BufferedReader(new FileReader(filename))){ 19 String[] rowcol = br.readLine().split(" "); 20 row = Integer.parseInt(rowcol[0]); 21 col = Integer.parseInt(rowcol[1]); 22 matrix = new double[row][col]; 23 String line = null; 24 for (int m = 0; m < row; m++) { 25 line = br.readLine(); 26 String[] record = line.split(" "); 27 for (int n = 0; n < col; n++) 28 matrix[m][n] = Double.parseDouble(record[n]); 29 } 30 } 31 catch (FileNotFoundException e) { 32 e.printStackTrace(); 33 } 34 catch (IOException e) { 35 e.printStackTrace(); 36 } 37 catch (NumberFormatException e) { 38 e.printStackTrace(); 39 } 40 } 41 42 public void print() { 43 for (int i = 0; i < row; i++) { 44 for (int j = 0; j < col; j++) 45 System.out.print(" " + matrix[i][j]); 46 System.out.println(); 47 } 48 System.out.println(); 49 } 50 51 public static void main(String[] args){ 52 if (args.length != 2) { 53 System.out.println("need two files"); 54 System.exit(1); 55 } 56 57 Matrix a = new Matrix(); 58 a.read(args[0]); 59 a.print(); 60 61 Matrix b = new Matrix(); 62 b.read(args[1]); 63 b.print(); 64 65 Matrix c = new Matrix(a, b); 66 c.print(); 67 } 68}

追記
行列の掛け算をコンストラクタで実行するのではなく、
a.multiply(b) で結果の Matrix を返してくれるようにしてみました。

Java

1import java.io.*; 2 3public class Matrix { 4 private int row, col; 5 private double[][] matrix; 6 7 public Matrix() {} 8 9 public Matrix(int row, int col) { 10 this.row = row; 11 this.col = col; 12 matrix = new double[row][col]; 13 } 14 15 public void read(String filename) { 16 try (BufferedReader br = new BufferedReader(new FileReader(filename))){ 17 String[] rowcol = br.readLine().split(" "); 18 row = Integer.parseInt(rowcol[0]); 19 col = Integer.parseInt(rowcol[1]); 20 matrix = new double[row][col]; 21 for (int m = 0; m < row; m++) { 22 String[] record = br.readLine().split(" "); 23 for (int n = 0; n < col; n++) 24 matrix[m][n] = Double.parseDouble(record[n]); 25 } 26 } 27 catch (FileNotFoundException e) { 28 e.printStackTrace(); 29 } 30 catch (IOException e) { 31 e.printStackTrace(); 32 } 33 catch (NumberFormatException e) { 34 e.printStackTrace(); 35 } 36 } 37 38 public void print() { 39 for (int i = 0; i < row; i++) { 40 for (int j = 0; j < col; j++) 41 System.out.print(" " + matrix[i][j]); 42 System.out.println(); 43 } 44 System.out.println(); 45 } 46 47 public Matrix multiply(Matrix b) { 48 if (col != b.row) return null; 49 Matrix c = new Matrix(row, b.col); 50 for (int i = 0; i < row; i++) 51 for (int j = 0; j < col; j++) { 52 c.matrix[i][j] = 0; 53 for (int k = 0; k < b.row; k++) 54 c.matrix[i][j] += matrix[i][k] * b.matrix[k][j]; 55 } 56 return c; 57 } 58 59 public static void main(String[] args){ 60 if (args.length != 2) { 61 System.out.println("need two files"); 62 System.exit(1); 63 } 64 65 Matrix a = new Matrix(); 66 a.read(args[0]); 67 a.print(); 68 69 Matrix b = new Matrix(); 70 b.read(args[1]); 71 b.print(); 72 73 Matrix c = a.multiply(b); 74 c.print(); 75 } 76}

投稿2021/07/04 20:12

編集2021/07/05 10:01
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soft_cream

2021/07/06 03:30

せっかくプログラムを頂いたのにごめんなさい 本文に記載しているメソッドのプロトタイプやメソッドの呼び出し方などは 仕様として指定されているので変更ができません ですが参考にはさせていただこうかと思います ありがとうごさいます
guest

0

ベストアンサー

多分ですけど、『whileの条件式内で変数を宣言しているのが原因』じゃないかなと。

問題の部分を見ると、

while (int M=0 < row && (line = br.readLine()) != null){ ... }

となっていますね。

ブロックの数とかは合っていそうですが、
ただ、『普通はwhile内で宣言はしないのでは』ないでしょうか。

試しに、Paiza IOで、

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 // Your code here! 6 7 while( int n = 0 < 5 ){ 8 System.out.println( "OK"); 9 } 10 } 11}

とやると同じようなエラーメッセージが出てきました。

構文もよく見ると、";" (セミコロン)がありません。

変数宣言は、

Java

1int a;

または

Java

1int a = 1;

のように宣言するはずです。

もしかして、for文と勘違いしていませんか?


[追記1]

Matrix.java:39: エラー: シンボルを見つけられません matrix.print(); ^ シンボル: メソッド print()

当たり前です。

肝心の 39行目を見ると、

Java

1matrix.print();

とありますが、このmatrixとはなんでしょうか?

ローカル変数(readメソッド内にある変数)としても存在しません。

でも、よく見ると、フィールドとして二次元配列があります。
( private double[][] matrix = new double [row][col]; )

ですが、これはあくまで『二次元配列』です。

二次元配列はあくまで配列の二次元版です。

配列が持っていないメンバ( printメソッド )を動かそうとしているから、

『おいおい、にーちゃん(あるいはねーちゃん)、そんなもんねーよ?』と突っ込まれているのです。

そもそも、可読性が悪すぎる。

今回のエラーは、『可読性が悪いことが原因』になっています。

クラス名 Matrix で、これのオブジェクトが matrix.

で、内部で保持している二次元配列も matrix となっている。

これでは、気を抜いたら書いた本人ですら『混乱』します。

(あれ、どっちのだったけ……って感じで)

Matrix.java:74: エラー: 不適合な型: Matrixをdouble[][]に変換できません: A = y.read(args[0]); ^

これに関しては、定義を確認してください。

まず、『A』とはなんでしょうか。

どうやら double [ ][ ] A のようですね。

つまり double型の二次元配列。

『y』とはなんでしょうか。

どうやら、Matrix y のようですね。

それでは、y.read( なんちゃら ) とはなんでしょうか。

Matrixクラスの
public Matrix read(String filename)
ですね。

定義を確認してください。

つまり、日本語で無理に書けば、

double型二次元配列 = Matrixクラスのオブジェクト.read(引数);

の状態になっています。

つまり、『本来はMatrixのオブジェクトを返しているのに、受け手がなぜかdouble型二次元配列で受け取ろうとしている』状態です。

ある意味、『椅子を10個のグラスに注ごうとしているようなもの』です。

そもそも入るわけがないです。

このように、『コンパイルエラーにはヒントが隠されています』。

コンパイルエラーは怒声でも暴言でも罵倒でもハラスメントでもなく、
コンパイラ等からのメッセージです。

なので恐れずに、メッセージを読んで対処しましょう。


[追記2]

ほぼ脳死でメソッドを使うときは .(メソッド)

基礎からやってください。

入門書やサイト等にあるのは『基礎』であり、
別の言い方にすると『道具』です。

プログラミング言語があるからソフトとかを作る…
のではなく、

『とある問題を解決するための道具として』プログラミング言語があるのです。

元々は軍事利用で、たとえば、弾道計算や暗号解読とかを目的にしたのです。

プログラムは魔法でもなんでもなく、人間が現実世界でやっている手順を逐一指示されながら処理しているだけほ代物である』です。

基礎をやるのは、料理で言えば
『包丁の使い方』や『材料が揃っているかの確認』とかに相当します。

なので、基礎を理解しましょう。

readメソッドに関してなのですが...

直接は無理です。

ですが、Matrixクラス側で、いわゆるgetter/setterに相当するやつを追加すれば、
戻り値として受け取るのはMatrixオブジェクトですが、
後から配列や二次元配列に変換できます。

まずは基礎からやりましょう


[追記3]

まず、getterとかのエラーの前に『オブジェクト指向とは何か』を学びましょう。

オブジェクト指向(以降、OOP)の基本概念は、
『データ(= フィールド)と処理(= メソッド)をひとまとめにしたオブジェクト』なるものを中心に見る発想法です。

C言語のようなオブジェクト指向以前の言語では
データと処理は別々でした。

それらをひとまとめにすることで、
『オブジェクトだけが対象データとその処理方法を知っている』状態にでき、
それによって、『オブジェクトに対象データの処理や管理を任せる』ということができます。

クラスやら継承やらはこの概念を表現するためのものです。

オブジェクトだけが知っているという状態にするため、
フィールドは基本的にprivateにするのです。

でも、それではフィールドを直接見ることはできません。

なので『苦肉の策』としていわゆるgetterとかを使うのです。

クラスはコンパイラとかに「こーゆーデータ構造(どういうデータを持っているかとか)があるんでよろしく〜♪」
のように伝えるためのものです。

staticなメソッドはC言語の関数と一緒です。

オブジェクトがする処理方法というより、
単なる関数としてのものに近いです。

なので、今回の場合、
staticなgetterで別のオブジェクトのデータを引っ張り出そうとしているからエラーになっています。
(厳密に言えば違うが、イメージ的にはそういう感じ)

投稿2021/07/04 09:50

編集2021/07/05 09:46
BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soft_cream

2021/07/04 12:38

回答していただいたお二人の意見を参考にしてプログラムを修正しコンパイルしたところ 隠れていたいくつかのエラーが表示されたため、 最初のプログラムを以下のように修正させていただきました。 その中の3つのエラーの修正の仕方が分からないため また意見を頂けないでしょうか 最初の問題については解決しました。ありがとうございます ーーーーーーーーーーーーーーーーーーーーーーー Matrix.java:39: エラー: シンボルを見つけられません matrix.print(); ^ シンボル: メソッド print() 場所: タイプdouble[][]の変数 matrix Matrix.java:74: エラー: 不適合な型: Matrixをdouble[][]に変換できません: A = y.read(args[0]); ^ Matrix.java:76: エラー: 不適合な型: Matrixをdouble[][]に変換できません: B = z.read(args[1]);
soft_cream

2021/07/04 12:39

import java.io.*; import java.io.FileInputStream; import java.io.InputStreamReader; public class Matrix{ private int row,col; public Matrix(){ } public Matrix(int M,int N){ this.row=M; this.col=N; } private double[][] matrix = new double [row][col]; public int getRow(String filename){ BufferedReader br = new BufferedReader(new FileReader(filename)); String rline = br.readLine(); String[] R = rline.split("\s"); int m = Integer.parseInt(R[0]); return m; } public int getColumn(String filename){ BufferedReader br = new BufferedReader(new FileReader(filename)); String cline = br.readLine(); String[] C = cline.split("\s"); int n = Integer.parseInt(C[1]); return n; } public Matrix read(String filename){ try (BufferedReader br = new BufferedReader(new FileReader(filename))){ String[] rowcol = br.readLine().split(" "); String line = null; int M=0; while (M < row && (line = br.readLine()) != null){ String[] record = line.split(" "); for (int N = 0; N < col ; N++) { matrix[M][N] = Double.parseDouble(record[N]); } M++; } matrix.print(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } } public void print(){ for(int i = 0; i<row; i++){ for(int j = 0; j<col; j++){ System.out.println(matrix[i][j]); } } } public static void main(String[] args){ if (args.length != 2) { System.out.println("need two files"); System.exit(1); } int arow,acol,brow,bcol; Matrix x = new Matrix(); arow=x.getRow(args[0]); acol=x.getColumn(args[0]); brow=x.getRow(args[1]); bcol=x.getColumn(args[1]); double [ ][ ] A = new double [arow][acol]; double [ ][ ] B = new double [brow][bcol]; double [ ][ ] C = new double [acol][brow]; Matrix y = new Matrix(arow,acol); A = y.read(args[0]); Matrix z = new Matrix(brow,bcol); B = z.read(args[1]); } }
BeatStar

2021/07/04 12:45

ここにコードを書かない方がいいです。 インデントが無視されて読みづらいです。 本文に追記として書くか、別の問題と考えるのなら別のスレとして立ててください。 (今回は本文に追記でいいと思う)
soft_cream

2021/07/04 13:02

申し訳ありません。 質問に追記してプログラムを記述しました。
BeatStar

2021/07/04 13:09 編集

忘れていましたが、『元のプログラムはそのままで』お願いします。 (質問の意図がずれる為) …あ、書いてありますね。 ただ、どちらの方なのかわかりにくいため、何かしらの方法でわかりやすくした方が無難かもしれません。
soft_cream

2021/07/04 15:07

返信ありがとうございます。 printメソッドに関して修正させていただきました。 ほぼ脳死でメソッドを使うときは .(メソッド) でいいのかな、なんて考えてしまっていました。 エラーメッセージに関しても 初めから無理だと決めつけていました。
soft_cream

2021/07/04 15:08

readメソッドに関してなのですが readメソッドの型はMatrixのままで readメソッドにより読み込んだ二次元配列をAに代入することは出来ないでしょうか A = y.read(args[0]); ↑この「A」の部分を Matrix x = new Matrix();で定義した「x」に変えて xを二次元配列に変換する 事などできないでしょうか
soft_cream

2021/07/04 15:29

ごめんなさい、何言ってるか意味不明ですよね java習いたてでまだ理解ができていない状態です
BeatStar

2021/07/04 23:31

追記しました。
soft_cream

2021/07/05 08:49

本文の質問にgetterやsetterを加えたプログラムを追記しました setterでprivateなmatrixをMATに代入し getterで利用する といった考えで書いたところ以下のようなエラーが表示されました Matrix.java:62: エラー: シンボルを見つけられません return MAT; ^ シンボル: 変数 MAT 場所: クラス Matrix
soft_cream

2021/07/05 08:52

考え方自体が間違っているのでしょうか もし記述ミスなどあれば教えてもらいたいです getterやsetterについて参考にできるサイトなどふぁあれば教えてもらいたいです 習い始めたばかりで基礎ができていないのも全くその通りなので java自体について知ることのできるサイトなども教えてもらえないでしょうか
guest

0

僕が普段使う方法を記しました。
質問の回答にはなっていないかもしれませんが一応参考までに記しておきます。

try{ BufferedReader bufferedReader = new BufferedReader(new FileReader(/*ファイル名*/)); //二次元配列の長さ int x = Integer.parseInt(bufferedReader.readLine()); int y = Integer.parseInt(bufferedReader.readLine()); String[] elements_line = new String[y]; String elements = new String[y][x]; //とりあえず一列ずつ読み込み for(int i=0;i<y;i++){ elements_line[i] = bufferedReader.readLine(); } bufferedReader.close();//変数bufferedReaderはもう使わないので //一列ずつ読み込んだものを一つずつにする for(int ii=0;ii<y;ii++){ for(int i=0;i<x;i++){ image_ids[ii][i]=String.valueOf(elements_line[ii].charAt(i)); } } }catch(Exception e){ e.printStackTrace(); }

エラーだけしか見ていませんが質問の回答します。while (int M=0 < row && (line = br.readLine()) != null){ の中にある
int M=0が悪さをしていると思うのでただの0にした方がよいかと思います。

while (int M=0 < row && (line = br.readLine()) != null){

から

while (0 < row && (line = br.readLine()) != null){

投稿2021/07/04 09:02

cretter

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soft_cream

2021/07/04 12:39

回答していただいたお二人の意見を参考にしてプログラムを修正しコンパイルしたところ 隠れていたいくつかのエラーが表示されたため、 最初のプログラムを以下のように修正させていただきました。 その中の3つのエラーの修正の仕方が分からないため また意見を頂けないでしょうか 最初の問題については解決しました。ありがとうございます ーーーーーーーーーーーーーーーーーーーーーーー Matrix.java:39: エラー: シンボルを見つけられません matrix.print(); ^ シンボル: メソッド print() 場所: タイプdouble[][]の変数 matrix Matrix.java:74: エラー: 不適合な型: Matrixをdouble[][]に変換できません: A = y.read(args[0]); ^ Matrix.java:76: エラー: 不適合な型: Matrixをdouble[][]に変換できません: B = z.read(args[1]);
soft_cream

2021/07/04 12:39

import java.io.*; import java.io.FileInputStream; import java.io.InputStreamReader; public class Matrix{ private int row,col; public Matrix(){ } public Matrix(int M,int N){ this.row=M; this.col=N; } private double[][] matrix = new double [row][col]; public int getRow(String filename){ BufferedReader br = new BufferedReader(new FileReader(filename)); String rline = br.readLine(); String[] R = rline.split("\s"); int m = Integer.parseInt(R[0]); return m; } public int getColumn(String filename){ BufferedReader br = new BufferedReader(new FileReader(filename)); String cline = br.readLine(); String[] C = cline.split("\s"); int n = Integer.parseInt(C[1]); return n; } public Matrix read(String filename){ try (BufferedReader br = new BufferedReader(new FileReader(filename))){ String[] rowcol = br.readLine().split(" "); String line = null; int M=0; while (M < row && (line = br.readLine()) != null){ String[] record = line.split(" "); for (int N = 0; N < col ; N++) { matrix[M][N] = Double.parseDouble(record[N]); } M++; } matrix.print(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } } public void print(){ for(int i = 0; i<row; i++){ for(int j = 0; j<col; j++){ System.out.println(matrix[i][j]); } } } public static void main(String[] args){ if (args.length != 2) { System.out.println("need two files"); System.exit(1); } int arow,acol,brow,bcol; Matrix x = new Matrix(); arow=x.getRow(args[0]); acol=x.getColumn(args[0]); brow=x.getRow(args[1]); bcol=x.getColumn(args[1]); double [ ][ ] A = new double [arow][acol]; double [ ][ ] B = new double [brow][bcol]; double [ ][ ] C = new double [acol][brow]; Matrix y = new Matrix(arow,acol); A = y.read(args[0]); Matrix z = new Matrix(brow,bcol); B = z.read(args[1]); } }
soft_cream

2021/07/04 13:02

本文に追記する形で修正後のプログラムを記述させていただきました
cretter

2021/07/04 13:25 編集

>Matrix.java:39: エラー: シンボルを見つけられません matrix.print();をただのprint();にしてください。 matrixは二次元配列の変数です。 次に >public Matrix read(String filename){ は戻り値がMatrixなのに対して変数Aはdoubleの二次元配列です。 それと、readメソッドにはreturn文がありません。
soft_cream

2021/07/04 15:09

返信ありがとうございます。 printメソッドに関して修正させていただきました。
soft_cream

2021/07/04 15:10

申し訳ありません、return matrix;の文を追加させていただきました。 readメソッドの型はMatrixのままで readメソッドにより読み込んだ二次元配列をAに代入することは出来ないでしょうか A = y.read(args[0]); ↑この「A」の部分を Matrix x = new Matrix();で定義した「x」に変えて xを二次元配列に変換する 事などできないでしょうか
soft_cream

2021/07/04 17:45

もしかすると、下の部分を double [ ][ ] A = new double [arow][acol]; double [ ][ ] B = new double [brow][bcol]; double [ ][ ] C = new double [acol][brow]; ↓ Matrix A = new Matrix(arow,acol); Matrix B = new Matrix(brow,bcol); Matrix c = new Matrix(acol,brow); A.read(); B.read(); のようにすれば A、Bにそれぞれ行列の要素が代入されるでしょうか 書き忘れていましたが C行列はこの後さらに「AとBの積を計算する」メソッドを追加するつもりで C行列はその時の積を代入するためのものです
cretter

2021/07/04 22:21

クラス変数A,Bに配列の要素が代入されているというよりも クラス変数A,B内の二次元配列の変数として保存されていますよ 一応書きますがクラス変数の中から変数を取得するためには「クラス変数.変数名」で使うことができます 今回の場合、クラス変数Aの中にあるmatrixの二次元配列が使いたけれは「A.matrix[/*数字*/][/*数字*/]」で使うことができます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問