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

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

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

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

Q&A

解決済

2回答

1384閲覧

条件にある要素のみリストに追加したいのですが、すべて追加されます。何が間違っているのでしょうか。

Chibichan

総合スコア72

Java

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

0グッド

0クリップ

投稿2020/08/29 12:50

編集2020/08/29 15:08

別のクラスの変数をこちらのクラスのリストに追加していくのですが、指定の重さに達するとリストへの追加しないようにしたいのですが、pu、blic void addTavaraメソッドで間違ってますでしょうか。今の状態ですと、重さを超えてもすべて追加されます。

import java.util.ArrayList; public class Matkalaukku { private final int maksimipaino; private final ArrayList<Tavara> tavarat; public Matkalaukku(int maksimipaino){ this.maksimipaino = maksimipaino; this.tavarat = new ArrayList<>(); } public void addTavara(Tavara tavara){ while(true){ int omosa = 0; omosa = omosa + tavara.getPaino(); if(omosa <= this.maksimipaino){//ここで追加されるのはthis.maksimipaino this.tavarat.add(tavara);//以下にしたつもりですが、すべて追加されます。 break< } } } @Override public String toString(){ if(this.tavarat.isEmpty()){ return "ei tavaroita (0 kg)"; } int count = 0; int omosa = 0; for (Tavara tavara: tavarat) { count++; omosa = omosa + tavara.getPaino(); } return count +" tavaraa ("+omosa+"kg)"; } } --- public class Tavara { private String nimi; private int paino; public Tavara(String nimi, int paino){ this.nimi = nimi; this.paino = paino; } public String getNimi(){ return this.nimi; } public int getPaino(){ return this.paino; } public String toString(){ return this.nimi+ "("+this.paino+"kg)"; } } --- public class Main { public static void main(String[] args) { Tavara kirja = new Tavara("Aapiskukko", 2); Tavara puhelin = new Tavara("Nokia 3210", 1); Tavara tiiliskivi = new Tavara("tiiliskivi", 4); Matkalaukku matkalaukku = new Matkalaukku(5); System.out.println(matkalaukku); matkalaukku.lisaaTavara(kirja); System.out.println(matkalaukku); matkalaukku.lisaaTavara(puhelin); System.out.println(matkalaukku); matkalaukku.lisaaTavara(tiiliskivi); System.out.println(matkalaukku); } }

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

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

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

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

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

swordone

2020/08/29 13:00

まずコンパイルが通るコードを書いてください。
guest

回答2

0

ベストアンサー

変数名やメソッド名が意味不明なので、質問で使っている「重さ」で表現を統一します。
クラス名やメソッド名、変数名は意味が分かるようにしてください。

java

1 public void addTavara(Tavara tavara){ 2 while(true){ 3 int omosa = 0; 4 omosa = omosa + tavara.getPaino(); 5 if(omosa <= this.maksimipaino){//ここで追加されるのはthis.maksimipaino 6 this.tavarat.add(tavara);//以下にしたつもりですが、すべて追加されます。 7 break< 8 } 9 10 }

ifで判定する時点の重さは、必ず引数の重さになります。
結局比較するのは、引数の重さと制限の重さとなり、あなたがやろうとしている「重さの合計の制限」ができません。
これをやるためには、追加しようとするたびに現在の合計の重さを計算するか、現在の重さの合計を保存しておくフィールド変数が必要です。

diff

1public class Matkalaukku { 2 private final int maksimipaino; 3 private final ArrayList<Tavara> tavarat; 4+ private int totalWeight = 0; //「現在の重さの合計」を管理するフィールド変数 5 public Matkalaukku(int maksimipaino){ 6 this.maksimipaino = maksimipaino; 7 this.tavarat = new ArrayList<>(); 8 } 9 public void addTavara(Tavara tavara){ 10- while(true){ 11- int omosa = 0; 12- omosa = omosa + tavara.getPaino(); 13- if(omosa <= this.maksimipaino){//ここで追加されるのはthis.maksimipaino 14+ if(totalWeight + tavara.getPaino() <= this.maksimipaino) { 15 this.tavarat.add(tavara); 16+ totalWeight += tavara.getPaino() 17- break< 18 } 19 20- } 21 }

投稿2020/08/29 18:25

swordone

総合スコア20669

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

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

Chibichan

2020/08/29 18:49

ありがとうございました!ようやく謎が解けました!
guest

0

java

1 2 if(omosa <= this.maksimipaino){//ここで追加されるのはthis.maksimipaino 3 break; //以下にしたつもりですが、すべて追加されます。 4 this.tavarat.add(tavara); 5 }

this.tavarat.add(tavara);には到達しない、というコンパイルエラーがでているのではありませんか。

ま、break文をみなかったことにすれば、tavara.getPaino()が、0か0以下の値を返してるのではなかろうか、と。

Tavaraクラスの内容も含めたちゃんとコンパイルできて動くソースを提示してみてください。



Tavaraクラスを下に追加しました。ご指摘お願いします。

ああ。while(true),breakが意味不明だったのですが、omosaを定義する場所がおかしいでしょう。
whileの中で定義したら、というか、addTavaraメソッドの中で定義したら、omosaは毎回0から開始。tavara.getPaino()がどんな値を返すか想像できませんが、if文はたいてい真になるのでしょうね。だから。

diff

1diff --git a/src/main/java/Matkalaukku.java b/src/main/java/Matkalaukku.java 2index f2f792d..4789dc6 100644 3--- a/src/main/java/Matkalaukku.java 4+++ b/src/main/java/Matkalaukku.java 5@@ -4,6 +4,7 @@ import java.util.ArrayList; 6 public class Matkalaukku { 7 private final int maksimipaino; 8 private final ArrayList<Tavara> tavarat; 9+ private int omosa = 0; 10 11 public Matkalaukku(int maksimipaino) { 12 this.maksimipaino = maksimipaino; 13@@ -11,13 +12,9 @@ public class Matkalaukku { 14 } 15 16 public void addTavara(Tavara tavara) { 17- while (true) { 18- int omosa = 0; 19- omosa = omosa + tavara.getPaino(); 20- if (omosa <= this.maksimipaino) {//ここで追加されるのはthis.maksimipaino 21- this.tavarat.add(tavara);//以下にしたつもりですが、すべて追加されます。 22- break; 23- } 24+ omosa = omosa + tavara.getPaino(); 25+ if (omosa <= this.maksimipaino) {//ここで追加されるのはthis.maksimipaino 26+ this.tavarat.add(tavara);//以下にしたつもりですが、すべて追加されます。 27 } 28 }

投稿2020/08/29 13:02

編集2020/08/29 14:41
shiketa

総合スコア4061

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

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

Chibichan

2020/08/29 14:09

Tavaraクラスを下に追加しました。ご指摘お願いします。
Chibichan

2020/08/29 15:12

Mainクラスも追加しました。Matkalaukkuクラスをご指摘の通り変更しましたが、ダメでした。Main クラスのMatkalaukku matkalaukku = new Matkalaukku(5);が、5なので、Tavara tiiliskivi = new Tavara("tiiliskivi", 4);の4を追加するとオーバーになるので、追加できないのですが、追加されます。 public void addTavara(Tavara tavara)メソッドで、条件文でMaksimpainoの指定の数を超えないようにしたいのですが、それができません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問