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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

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

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

2388閲覧

自分で定義した型(Matrix)の配列をA,Bと二つ生成したい

-_sora.

総合スコア12

多次元配列

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

Java

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

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/07/09 11:22

編集2020/07/09 13:52

前提・実現したいこと

自分で定義した型(Matrix)の配列をA,Bと二つ生成したい

発生している問題・エラーメッセージ

下記のread関数のreturn部分で「double[][]からMatrix型には変換できません」と表示され,同じくread関数のthis.m[row][col] = {{2,3},{2,2}}; 部分で「構文エラーです」と表示される.

該当のソースコード

Matrix.java

1import java.io.BufferedReader; 2import java.io.FileReader; 3 4public class Matrix { 5 6 private int row; /* 行列の列 */ 7 private int col; /* 行列の行 */ 8 private double[][] m = new double[row][col]; /* 使用する行列 */ 9 10 public Matrix(){ /* コンストラクタ */ 11 this.m = new double[row][col]; 12 } 13 public Matrix read(String file) { /* ファイルから読み込んで行列を生成する */ 14 try { 15 BufferedReader br = new BufferedReader(new FileReader(file)); 16 String line; 17 this.row=2; /* 適当に代入 */ 18 this.col=2; /* 適当に代入 */ 19 20 21 while ((line = br.readLine()) != null){/* 行単位で処理 */ 22 /* 処理は省略 */ 23 24 } 25 26 27 this.m[row][col] = {{2,3},{2,2}}; /* 試しに適当に代入(この部分でエラーが出る) */ 28 29 30 return m; /* この部分でエラーが出る */ 31 } 32 catch(Exception e){ 33 e.printStackTrace();/* エラー処理 :トレース*/ 34 return m; 35 } 36 } 37 38 public static void main(String[] args) { 39 String file1; 40 String file2; 41 42 file1=args[0]; 43 file2=args[1]; 44 45 Matrix instance = new Matrix(); 46 Matrix A = instance.read(file1); 47 Matrix B = instance.read(file2); 48 49 } 50 51 52} 53

試したこと

本来であればファイルからスペースで区切られた行列の値を読み込んで生成したいのですが,ひとまずその処理は省略して適当にrow,col,m[][]に代入しています.

//追記
コンストラクタでのthis.m = new double[row][col];のrow,colには0が入っているから改めてmを初期化する必要がある…というところまで分かったのですが,read(String)の返り値としてMatrix型の変数は何を指定してやればよいのかわかりません.mはdouble型であってMatrix型でないならば何を返せばよいのでしょうか?

補足情報(FW/ツールのバージョンなど)

eclipse 2019のjava10を使用しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

ファイルの先頭に row と col の値があるものとします。
file1.txt

2 2 1 7 5 3

file2.txt

3 5 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9 10 11 12 13 14 15

Java

1import java.util.Scanner; 2import java.io.*; 3 4class Matrix { 5 6 private int row; // 行列の行 7 private int col; // 行列の列 8 private double[][] m; // 使用する行列 9 10 public Matrix(int row, int col) { 11 this.row = row; this.col = col; m = new double[row][col]; 12 } 13 public int getRow() { return row; } 14 public int getCol() { return col; } 15 public double get(int i, int j) { return m[i][j]; } 16 public void set(int i, int j, double d) { m[i][j] = d; } 17 18 public static Matrix read(String file) { 19 try { 20 Scanner sc = new Scanner(new File(file)); 21 int row = sc.nextInt(), col = sc.nextInt(); 22 Matrix mat = new Matrix(row, col); 23 for (int i = 0; i < row; i++) 24 for (int j = 0; j < col; j++) 25 mat.set(i, j, sc.nextDouble()); 26 sc.close(); 27 return mat; 28 } 29 catch (Exception e) { 30 e.printStackTrace(); 31 return null; 32 } 33 } 34} 35 36class Test { 37 public static void main(String[] args) { 38 if (args.length != 2) return; 39 Matrix A = Matrix.read(args[0]); 40 Matrix B = Matrix.read(args[1]); 41 print(A); 42 print(B); 43 } 44 45 private static void print(Matrix mat) { 46 int row = mat.getRow(), col = mat.getCol(); 47 for (int i = 0; i < row; i++) { 48 for (int j = 0; j < col; j++) 49 System.out.printf("%8.3f", mat.get(i, j)); 50 System.out.println(); 51 } 52 System.out.println(); 53 } 54}

java Test file1.txt file2.txt の実行結果

1.000 7.000 5.000 3.000 1.100 2.200 3.300 4.400 5.500 6.600 7.700 8.800 9.900 10.000 11.000 12.000 13.000 14.000 15.000

ファイルの先頭に row と col の値がなくてもできますが、ちょっと面倒です。

投稿2020/07/09 23:19

編集2020/07/09 23:25
kazuma-s

総合スコア8224

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

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

-_sora.

2020/07/11 17:32

ありがとうございます! まさかやりたいことをすべて書いていただけるとは…
guest

0

return m; /* この部分でエラーが出る */

mは、doubleの2次元配列

なので、

public Matrix read(String file)

の戻り値(Matrix型)と異なるためエラーになります。

もう1個の方は、コンパイルエラーについては、asahina1979さんの回答通り。

ただ、コンストラクタで

this.m = new double[row][col]; // この時点でrowとcolは0

ってやっているので、仮に修正しても実行時エラーがでます。
なので、適当に代入のあとで改めて m を初期化する必要があります。

java

1this.row=2; /* 適当に代入 */ 2this.col=2; /* 適当に代入 */ 3 4this.m = new double[row][col];

{{2,3},{2,2}}のような形で初期化したいなら

java

1this.m = new double[][] {{2,3},{2,2}};

こんな感じに記述します。

投稿2020/07/09 13:20

編集2020/07/09 13:29
momon-ga

総合スコア4820

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

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

-_sora.

2020/07/09 13:47

ありがとうございます. 後半部分に関しては理解できたのですが,return m のmがMatrix型ではなくdouble型だからエラーが発生している件について,ここでいうMatrix 型とは何が当てはまるのでしょうか? mainのA,Bに入れてやりたいのですが,returnで返せる変数というのがよく分かりません.
momon-ga

2020/07/09 15:00 編集

return m が、やりたいことならメソッドの戻り値の定義をdouble[][]にすれば良いのでは? ※合わせてmain側も以下のように修正する必要ありますけど double[][] A = instance.read(file1); Matrixを返したいなら、新しいインスタンスを作って返せばいいだけですけど。 mainの中でnewしてますよね? 単純な実装なら return new Matrix(); そもそも、double[][]とMatrixを変換する処理みたいなのが必要じゃないの? ただ、その変換方法は回答者の誰も知らないので聞かれても答えられないけど・・・ ※処理は適当に、とか省略されてる部分だろうと思いますが
kazuma-s

2020/07/10 07:42

return m; の代わりに return this; なら文法上はエラーになりません。 でも、instance が 1個なので、Matrix A = instance.read(file1) でその instance に読み込んだデータは 次の Matrix B = instance.read(file2); で上書きされ、A も B も file2 のデータを持つことになります。 意味的にはエラーですね。
momon-ga

2020/07/10 08:22

retun this;するなら、 Matrix A = instance.read(file1); を Matrix A = new Matrix().read(file1); にする感じですかねぇ。 それなら、最初からstaticメソッドにしたほうがよさそうだけど。
guest

0

this.m[0][0] = {{2,3},{2,2}}; /* 試しに適当に代入(この部分でエラーが出る) */

これだと double を期待したが 二次元配列だったためエラー

投稿2020/07/09 11:44

編集2020/07/09 11:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

-_sora.

2020/07/09 11:52

ああ確かに・・・ しかし「試したこと」にも書いておりますが,this.m[][] = {{2,3},{2,2}}; のように添え字を指定せずともエラーが出てしまいました.どうすればよいのか助言をいただけませんか?
kazuma-s

2020/07/10 06:15

double a[][] = {{2,3},{2,2}}; this.m = a; とすればいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問