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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1448閲覧

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

soft_cream

総合スコア11

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/07/06 00:32

編集2021/07/06 03:38

「テキストファイルから2つの行列データを読み込み二次元配列に保存したものを表示する」プログラムを
codeの欄のように作成しました
このプログラムは行列A、Bそれぞれについて
getRow、getColumメソッドにより指定されたファイルから1行読み込み、行(row)と列(col)の数を取得する
readメソッドにより以降の行も順に読んでいき、二次元配列に保存する
printメソッドにより表示を行う
といった流れのプログラムです

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

readメソッドにおける戻り値をどのように書けばよいのかが分からないので教えてもらいたいです
はじめにcodeのプログラムのようにしてコンパイルすると
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Matrix.java:51: エラー: 不適合な型: double[][]をMatrixに変換できません:
return matrix;
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
↑このようなエラーが表示されました
readメソッドの型と戻り値の型が違うというのは理解できましたが
保存した二次元配列の内容を
どのようにMatrix型の戻り値として書けば良いのかが分かりません
教えていただけるとありがたいです

※情報追加・修正依頼について回答させていただきました

java

1import java.io.*; 2import java.io.FileInputStream; 3import java.io.InputStreamReader; 4public class Matrix{ 5 private int row,col; 6 private double[][] matrix = new double [row][col]; 7 8 public Matrix(){ 9 } 10 public Matrix(int M,int N){ 11 this.row=M; 12 this.col=N; 13 } 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 return matrix; //質問している部分 52 } 53 public void print(){ 54 for(int i = 0; i<row; i++){ 55 for(int j = 0; j<col; j++){ 56 System.out.println(matrix[i][j]); 57 } 58 } 59 } 60 public 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 Matrix y = new Matrix(arow,acol); 72 Matrix A = y.read(args[0]); 73 Matrix z = new Matrix(brow,bcol); 74 Matrix B = z.read(args[1]); 75 } 76} 77

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

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

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

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

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

dodox86

2021/07/06 00:58

>@K_3578さん 今回の質問についてはもしかしたら#347600に対する私の[2021/07/05 18:35]のコメントを受けてのこと(つまり、発展した別の質問)だったかもしれません。
K_3578

2021/07/06 01:08

>dodox86さん 追記・修正依頼欄は見落としていました。ありがとうございます。 だとしても#347600での最初の質問は解決したのならばクローズにして頂きたいところではありますが。
soft_cream

2021/07/06 01:23

申し訳ありません 主に返信を頂いていた方からの返信を一応待っていたのですが マナー的によくないですよね ベストアンサーを選ばせてもらいました
Crimson_Tide

2021/07/06 02:04

昨日質問された https://teratail.com/questions/347741 と何が違うのですか? エラーが出るたびに新たに質問をするつもりですか? https://teratail.com/questions/347741#reply-476940 >メンバー変数とstatic変数の違いがわかってないような気がするので 一度整理された方が良いかと思います。 という Luice さんのコメントに対して何か対応されましたか? https://teratail.com/questions/347600#reply-476867 でkazuma-sさんが回答として解決コードを提示されています。 何もコメントされていませんが、参考にならなかったのでしょうか?
soft_cream

2021/07/06 03:24 編集

getterなどを利用する方法を試してみたものの行き詰り 他の方法もないかなと考えて returnを使ってみようとしたための質問でした Luiceさんからアドバイスをいただき調べてはみました kazuma-sさんからいただいた回答に関しては 求めていた元のプログラムの仕様と違っていたので 書き直してもらうのも悪いと思い 解決するまで後回しにしてしまっていました 初心者過ぎる自分にはまだテラテイルは早いのかもしれません テラテイルはしばらく控えて 何が分かって何が分からないのかとか もう少し整理しようと思います
K_3578

2021/07/06 04:17

回答の内容について理解出来ていないのが原因だと思いますよ。 もう一回最初から基礎をやり直しては。
guest

回答1

0

row と col と matrix の読み込みを別々にして同じファイルを読むのは無駄だと思いますが、
メソッドの仕様を変えずに書いてみました。

Java

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

getRow と getColumn は、
Matrixクラスのフィールド row、col、matrix を使っていないので、
main のように staticメソッドにすると、Matrix x = new Matrix();
が不要になって、x. の代わりに Matrix. と書くだけで済みます。

read の中で print を呼ぶのも変ですがそのままです。

"\s" がエラーになりませんか?
"\n" や "\t" はありますが、"\s" はありません。
string の split が正規表現を受け付けるので "\s" の間違いでは?

投稿2021/07/06 15:29

編集2021/07/06 23:49
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問