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

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

ただいまの
回答率

88.91%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 182

-_sora.

score 6

前提・実現したいこと

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

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

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

該当のソースコード

import java.io.BufferedReader;
import java.io.FileReader;

public class Matrix {

    private int row;  /* 行列の列 */
    private int col; /* 行列の行 */
    private double[][] m = new double[row][col]; /* 使用する行列 */

    public Matrix(){ /* コンストラクタ */
        this.m = new double[row][col];
    }
    public Matrix read(String file) { /* ファイルから読み込んで行列を生成する */
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;
            this.row=2; /* 適当に代入 */
            this.col=2; /* 適当に代入 */


            while ((line = br.readLine()) != null){/* 行単位で処理 */
                /* 処理は省略 */

            }


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


            return m; /* この部分でエラーが出る */
        }
        catch(Exception e){
            e.printStackTrace();/* エラー処理 :トレース*/
            return m;
        }
    }

    public static void main(String[] args) {
        String file1;
        String file2;

        file1=args[0];
        file2=args[1];

        Matrix instance = new Matrix();
        Matrix A = instance.read(file1);
        Matrix B = instance.read(file2);

    }


}

試したこと

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

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
import java.util.Scanner;
import java.io.*;

class Matrix {

    private int row;      // 行列の行
    private int col;      // 行列の列
    private double[][] m; // 使用する行列

    public Matrix(int row, int col) {
        this.row = row; this.col = col; m = new double[row][col];
    }
    public int getRow() { return row; }
    public int getCol() { return col; }
    public double get(int i, int j) { return m[i][j]; }
    public void set(int i, int j, double d) { m[i][j] = d; }

    public static Matrix read(String file) {
        try {
            Scanner sc = new Scanner(new File(file));
            int row = sc.nextInt(), col = sc.nextInt();
            Matrix mat = new Matrix(row, col);
            for (int i = 0; i < row; i++)
                for (int j = 0; j < col; j++)
                    mat.set(i, j, sc.nextDouble());
            sc.close();
            return mat;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

class Test {
    public static void main(String[] args) {
        if (args.length != 2) return;
        Matrix A = Matrix.read(args[0]);
        Matrix B = Matrix.read(args[1]);
        print(A);
        print(B);
    }

    private static void print(Matrix mat) {
        int row = mat.getRow(), col = mat.getCol();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++)
                System.out.printf("%8.3f", mat.get(i, j));
            System.out.println();
        }
        System.out.println();
    }
}


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/12 02:32

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

    キャンセル

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 20:52

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

    キャンセル

  • 2020/07/10 15:15

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

    キャンセル

0

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

mは、doubleの2次元配列

なので、

public Matrix read(String file)

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

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

ただ、コンストラクタで

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

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

this.row=2; /* 適当に代入 */
this.col=2; /* 適当に代入 */

this.m = new double[row][col];

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 22:47

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

    キャンセル

  • 2020/07/09 23:59 編集

    return m が、やりたいことならメソッドの戻り値の定義をdouble[][]にすれば良いのでは?
    ※合わせてmain側も以下のように修正する必要ありますけど
    double[][] A = instance.read(file1);

    Matrixを返したいなら、新しいインスタンスを作って返せばいいだけですけど。
    mainの中でnewしてますよね?
    単純な実装なら
    return new Matrix();
    そもそも、double[][]とMatrixを変換する処理みたいなのが必要じゃないの?
    ただ、その変換方法は回答者の誰も知らないので聞かれても答えられないけど・・・
    ※処理は適当に、とか省略されてる部分だろうと思いますが

    キャンセル

  • 2020/07/10 16:42

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

    キャンセル

  • 2020/07/10 17:22

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

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問