回答編集履歴

1

追記

2018/02/04 07:38

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -89,3 +89,23 @@
89
89
 
90
90
 
91
91
  [https://teratail.com/help#about-markdown](https://teratail.com/help#about-markdown)
92
+
93
+
94
+
95
+ ---
96
+
97
+ 追記:3つのカードが全て削除されてしまう問題に対して。
98
+
99
+
100
+
101
+ 元のループアルゴリズムですと同一のリストに対する単純な二重ループですので、同じダイヤの4でそれぞれ異なるインスタンスが3つありそれらをD4#1,D4#2,D4#3とすると
102
+
103
+ D4#1 vs D4#2 => この2つをdiscardsに追加
104
+
105
+ D4#1 vs D4#3 => この2つもdiscardsに追加
106
+
107
+ ...
108
+
109
+ のように、「同一のカードインスタンスを複数回discardsに格納し得る論理」になっている点がまずいですね。
110
+
111
+ 対処には色々方法が考えられれます。discardsへ追加する条件に、「c1もc2もdiscardsに含まれない」を追加するというのが最も単純と思います。含まれるかどうかをチェックするメソッドとしてコレクション一般にcontainsというのがありますので、D4#1.equals(D4#2)がfalseとなるようにCardクラスが定義されているならそれを使えます。D4#1.equals(D4#2)がtrueになるようでしたらcontainsは使えませんので別途自前でcontainsCardメソッドのようなものを定義する必要がでてきます。