teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

Orderクラスの無駄を省く

2016/11/23 15:19

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,4 +1,45 @@
1
1
  containsの判定にはequalsを使います。デフォルトでは「同じオブジェクト」の時だけtrueとなるので、現状等しいオブジェクトを見つけられません。
2
2
  equalsをオーバーライドして、等しいの定義付けをする必要があります。
3
3
 
4
- ここからは構成上の話になりますが、FoodクラスとOrderクラスというのは不自然です。「食べ物」を意味するクラスFoodがあり、そのFoodが「注文されたもの」か「在庫にあるもの」かという色づけがされるわけです。
4
+ ここからは構成上の話になりますが、FoodクラスとOrderクラスというのは不自然です。「食べ物」を意味するクラスFoodがあり、そのFoodが「注文されたもの」か「在庫にあるもの」かという色づけがされるわけです。
5
+
6
+ 率直に考えればこうなります。
7
+ ```java
8
+ class Food{
9
+ public int id;
10
+ public String name;
11
+ public Food(int id,String name){
12
+ this.id = id;
13
+ this.name = name;
14
+ }
15
+
16
+ public boolean equals(Object o) {
17
+ if (o == this) return true;
18
+ if (o.getClass() != this.getClass()) return false;
19
+ Food f = (Food)o;
20
+ return this.id == f.id && this.name.equals(f.name);
21
+ }
22
+ //hashcodeの実装は省略
23
+ }
24
+
25
+ public class App {
26
+ public static void main(String[] args) {
27
+
28
+ List<Food> orderList = new ArrayList<>();
29
+ List<Food> foodList = new ArrayList<>();
30
+
31
+ orderList.add(new Food(1,"アップル"));
32
+ orderList.add(new Food(2, "バナナ"));
33
+ orderList.add(new Food(3, "綿菓子"));
34
+
35
+ foodList.add(new Food(1,"アップル"));
36
+ foodList.add(new Food(2, "バナナ"));
37
+
38
+ for (int i = 0; i < orderList.size(); i++) {
39
+ if(!foodList.contains(orderList.get(i))){
40
+ System.out.println(orderList.get(i));
41
+ }
42
+
43
+ }
44
+ }
45
+ ```

1

2種類のくらさ

2016/11/23 15:19

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,2 +1,4 @@
1
1
  containsの判定にはequalsを使います。デフォルトでは「同じオブジェクト」の時だけtrueとなるので、現状等しいオブジェクトを見つけられません。
2
- equalsをオーバーライドして、等しいの定義付けをする必要があります。
2
+ equalsをオーバーライドして、等しいの定義付けをする必要があります。
3
+
4
+ ここからは構成上の話になりますが、FoodクラスとOrderクラスというのは不自然です。「食べ物」を意味するクラスFoodがあり、そのFoodが「注文されたもの」か「在庫にあるもの」かという色づけがされるわけです。