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

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

ただいまの
回答率

88.77%

java クラス型変数のfor文による加算

解決済

回答 5

投稿 編集

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

インスタンスをfor文で足していく

javaの クラス型同士の繰り返し処理による演算について
インスタンスのフィールド中の配列を足していって合計を表示するプログラムを書いているのですが
同じ型同士のインスタンスを繰り返し処理でsum=sum+w.add(w);とかくとこの部分にエラーが出てしまいます。普通の変数ならこのようなやり方でも対丈夫なのですがクラス型の場合はどのようにすればよいのでしょうか。以下、ソースコードになります

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

エラーメッセージ

該当のソースコード

public class Test{
        class MyWeight{
            private int ton;
            private int kgram;
            private int gram;


            public void setWeight(int t,int kg,int gr) {
                 ton = t + ((kg + (gr/1000)) /1000) ;
                 kgram = (kg + gr/1000) % 1000;
                 gram = gr % 1000;

            }
            public int getT() {
                return ton;
            }
            public int getKG() {
                return kgram;
            }
            public int getG(){
                return gram;
            }
            public MyWeight add(MyWeight x) {
                int t = 0,kg = 0,gr = 0;
                t = t+ x.getT();
                kg = kg + x.getKG();
                gr = gr+ x.getG();
                MyWeight y = new MyWeight();
                y.setWeight( t, kg, gr);
                return y;

            }

        public void main(String args[]) {
            int tonn[] = { 20, 30, 10, 20, 20 };
            int kgr[] = { 250, 780, 190, 360, 450 };
            int gramu[] = { 310, 400, 960, 210, 730 };

            MyWeight w=new MyWeight();
            MyWeight sum;

            for(int i=0;i<4;i++) {
                w.setWeight(tonn[i],kgr[i],gramu[i]);
                sum = sum + w.add(w);
            }
            System.out.println("合計は"+sum.getT()+"トン"+sum.getKG()+"キログラム"+sum.getG()+"です");
            }
        }
}


よろしくお願いいたします。
追記

    public    class MyWeight{
            private int ton;
            private int kgram;
            private int gram;


            public void setWeight(int t,int kg,int gr) {
                 ton = t + ((kg + (gr/1000)) /1000) ;
                 kgram = (kg + gr/1000) % 1000;
                 gram = gr % 1000;

            }
            public int getT() {
                return ton;
            }
            public int getKG() {
                return kgram;
            }
            public int getG(){
                return gram;
            }
            public MyWeight add(MyWeight x) {
                int t = 0,kg = 0,gr = 0;
                t = t+ x.getT();
                kg = kg + x.getKG();
                gr = gr+ x.getG();
                MyWeight y = new MyWeight();
                y.setWeight( t, kg, gr);
                return y;

            }


        public static void main(String args[]) {
            int tonn[] = { 20, 30, 10, 20, 20 };
            int kgr[] = { 250, 780, 190, 360, 450 };
            int gramu[] = { 310, 400, 960, 210, 730 };

            MyWeight w=new MyWeight();
            MyWeight sum = new MyWeight();

            for(int i=0;i<5;i++) {
                w.setWeight(tonn[i],kgr[i],gramu[i]);
                sum.setWeight(tonn[i],kgr[i],gramu[i]);
                sum = sum.add(w);

            }
            System.out.println("sum"+sum.getT()+"t"+sum.getKG()+"kg"+sum.getG()+"g");
            }
        }


*すみません、下の方のクラスが見つからなかった問題は解決しました。

回答を参考に以上のように修正してみたのですが、[4]番目の配列しか表示されませんでした.すべてのすべての配列を合計したのを表示したいのですがよくわかりません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

checkベストアンサー

+1

+ など演算子の挙動を上書きすることを演算子オーバーロードと呼びますが、Javaではできないです。
どうしてもやりたいなら sum = sum.add(w); で加算できるようにコードを組んでください。

回答を参考に以上のように修正してみたのですが、[4]番目の配列しか表示されませんでした.すべてのすべての配列を合計したのを表示したいのですがよくわかりません。

MyWeight#addの実装が間違っています。
どのような計算をしているのか、じっくり点検してみてください。

ヒント:  0 + a = a

その他気になること
  • setWeightメソッドは無い方が良い。コンストラクタを有効活用してください。
  • gramとkgramとtonを同じインスタンスに入れるのは意味が分からないです。
    グラム量で一元管理して、必要なときだけ単位を換算すれば良い。
  • オブジェクトwを使いまわさない。一時オブジェクトで良いならforブロック内で生成する。
  • 文字列化したいなら、Object#toStringメソッドをオーバーライドする必要がある。
    あるいは sum.getAsTon() などとして数量を獲得する。

追記

解決したようなので、解いてみた。

class Weight {
    private final int gram;

    Weight(int ton, int kiloGram, int gram) {
        this(1_000_000 * ton + 1_000 * kiloGram + gram);
    }
    Weight(int gram) {
        this.gram = gram;
    }

    Weight add(Weight other) {
        return new Weight(this.gram + other.gram);
    }

    @Override
    public String toString() {
        int gram = this.gram;

        int ton = gram / 1_000_000;
        gram %= 1_000_000;

        int kiloGram = gram / 1_000;
        gram %= 1_000;

        return String.format("%dt %dkg %dg", ton, kiloGram, gram);
    }
}

class Main {
    public static void main(String args[]) {
        int[] tons      = { 20,  30,  10,  20,  20};
        int[] kiloGrams = {250, 780, 190, 360, 450};
        int[] grams     = {310, 400, 960, 210, 730};

        int len = tons.length;
        assert(
               len == kiloGrams.length
            && len ==     grams.length
        );

        var total = new Weight(0);
        for(int i = 0; i < len; ++i) {
            total = total.add(
                new Weight(tons[i], kiloGrams[i], grams[i])
            );
        }

        System.out.println(total);
    }
}

実行結果 Wandbox

102t 32kg 610g

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/15 14:39

    返答ありがとうございます。このMyWeightクラスの中身の殆どは大学の講義資料の引用なのでそこまで考えが及びませんでした。確認してみます。

    キャンセル

  • 2019/04/15 15:34

    ありがとうございます!おかげさまでできました!

    キャンセル

+1

System.out.println("合計は"+sum+"トンです");


と書かれていることからトンを求めているのですよね。
したらsumMyWeight型ではなくintで宣言してください。

すると次はここが破綻します。

sum = sum + w.add(w);


なぜか?MyWeightクラスのaddメソッドの戻り値はMyWeightだからです。

ここで考えてみてください。
トンの合計を求めているのですから、wから欲しいのはMyWeightではなく、wが持つ重さ(ton)だと思いませんか?
ちなみにtonint型です。

ではwからtonを取得する処理を作る必要があります。
ですが心配しないでください。あなたはもう既にその処理を作っています
それはgetTメソッドです。

getTメソッドとsumを合計した値を返してあげればキロの合計が求まるはずです。

sum = sum + w.getT();

追記

内容を履き違えていました。

インスタンス同士を+で足すなどの実装はJavaでは出来ないと思います。
手としてAddメソッドのようにMyWeightが持つtonkgramgramに対して内部で足してあげることに尽きるかと。

forの中でsum = sum.Add(w);を読んでsumのgetterメソッドを出力してください。

余談:
Addメソッドの中で新しいインスタンス(y)を作っていますが、作らないでも実装できます。
作らない方が余計なメモリを食わずに済みますので、そこは課題として考えてみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/15 14:30

    すいません。最期の文章編集したのでよろしければ見てください
    System.out.println("合計は"+sum.getT()+"トン"+sum.getKG()+"キログラム"+sum.getG()+"です");
    配列の中身を合計してすべてを出力したいのです。表記ミスをしてしまってすいません
    }

    キャンセル

  • 2019/04/15 14:31 編集

    エラーを解決したいのが主旨かと内容を履き違えていました。すみません。あとで追記します。

    キャンセル

+1

javaにはC++のようなoperatorが存在しない為、オリジナルクラスで演算式を追加する事は出来ません。
あとjavaでも静的関数の作り方忘れたので調べておいて下さい。

静的関数でMyWeight add(MyWeight x,MyWeight y)のような関数を作って中の変数を足し算するしかありません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

以下のように修正してみたのですが、コンパイルして実行しようとすると 
エラー: メイン・クラスMyWeightが見つからなかったかロードできませんでした
と出てきます。どうすれば実行できるようになるのかわかりません。ファイル名はMyWeight.javaだから大丈夫だと思ってたんですが・・・

    public    class MyWeight{
            private int ton;
            private int kgram;
            private int gram;


            public void setWeight(int t,int kg,int gr) {
                 ton = t + ((kg + (gr/1000)) /1000) ;
                 kgram = (kg + gr/1000) % 1000;
                 gram = gr % 1000;

            }
            public int getT() {
                return ton;
            }
            public int getKG() {
                return kgram;
            }
            public int getG(){
                return gram;
            }
            public MyWeight add(MyWeight x) {
                int t = 0,kg = 0,gr = 0;
                t = t+ x.getT();
                kg = kg + x.getKG();
                gr = gr+ x.getG();
                MyWeight y = new MyWeight();
                y.setWeight( t, kg, gr);
                return y;

            }

        public void main(String args[]) {
            int tonn[] = { 20, 30, 10, 20, 20 };
            int kgr[] = { 250, 780, 190, 360, 450 };
            int gramu[] = { 310, 400, 960, 210, 730 };

            MyWeight w=new MyWeight();
            MyWeight sum = new MyWeight();

            for(int i=0;i<4;i++) {
                w.setWeight(tonn[i],kgr[i],gramu[i]);
                sum.setWeight(tonn[i],kgr[i],gramu[i]);
                sum = sum.add(w);
            }
            System.out.println("sum"+sum.getT()+"ton");
            }
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/15 14:54

    public 『static』 void main です。
    それはさておき、情報を追記したい場合は質問本文を編集して追記してください。ここは回答欄です。

    キャンセル

  • 2019/04/15 14:57

    返答ありがとうございます。staticを入力してもエラーメッセージは変わりませんでした。
    テラテイルの利用は初めてなのでよくわからないまま使ってしまいました。頭に入れときます

    キャンセル

  • 2019/04/15 15:03

    public class MyWeightの最後の"}"が抜けてますね...
    あとこの謎の4文字の空白は何ですか?

    キャンセル

0

質問を参考に以下のようにしたらできました!みなさんありがとうございました!

    public    class MyWeight {
            private int ton;
            private int kgram;
            private int gram;


            public void setWeight(int t,int kg,int gr) {
                 ton = t + ((kg + (gr/1000)) /1000) ;
                 kgram = (kg + gr/1000) % 1000;
                 gram = gr % 1000;

            }
            public int getT() {
                return ton;
            }
            public int getKG() {
                return kgram;
            }
            public int getG(){
                return gram;
            }
            public MyWeight add(MyWeight x) {
                int t = 0,kg = 0,gr = 0;
                t = ton+ x.getT();
                kg = kgram + x.getKG();
                gr = gram+ x.getG();
                MyWeight y = new MyWeight();
                y.setWeight( t, kg, gr);
                return y;

            }


        public static void main(String args[]) {
            int tonn[] = { 20, 30, 10, 20, 20 };
            int kgr[] = { 250, 780, 190, 360, 450 };
            int gramu[] = { 310, 400, 960, 210, 730 };

            MyWeight w=new MyWeight();
            MyWeight sum = new MyWeight();

            for(int i=0;i<5;i++) {
                w.setWeight(tonn[i],kgr[i],gramu[i]);
                sum = sum.add(w);

            }
            System.out.println("sum"+sum.getT()+"t"+sum.getKG()+"kg"+sum.getG()+"g");
            }
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る