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

回答編集履歴

3

追記

2018/08/15 10:44

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,3 +1,73 @@
1
+ 追記: 2018/08/15
2
+ ---
3
+ 怒涛の低評価が入ったので、古い話題ではありますがせっかくなので追記しておきます。
4
+
5
+ 個人的には、CardHandクラスにrankTableなどのフィールドを用意すると楽なように思います。
6
+ rankTableは『カードのランク』対『枚数』の連想配列です。
7
+
8
+ rankTableを適宜確認し、値が2以上のときに整理すれば良いです。
9
+ ```Java
10
+ class CardHand {
11
+ private Map<Integer, Integer> rankTable = new HashMap<>();
12
+ {
13
+ IntStream.rangeClosed(1, 13)
14
+ .forEach(e -> rankTable.put(e, 0))
15
+ ;
16
+ }
17
+ public void addCard(Card card) {
18
+ 手札に追加する通常の処理;
19
+
20
+ rankTable.compute(
21
+ card.getRank(), (key, old) -> old + 1
22
+ );
23
+ }
24
+ public void removeCard(Card card) {
25
+ 手札から排除する通常の処理;
26
+
27
+ rankTable.compute(
28
+ card.getRank(), (key, old) -> old - 1
29
+ );
30
+ }
31
+ private void removeCardByRank(int rank) {
32
+ Card card = 当該ランクのカードを一枚選択;
33
+ removeCard(card);
34
+ }
35
+
36
+ private boolean hasDuplicateCards() {
37
+ return rankTable.entrySet().stream()
38
+ .map(Map.Entry::getValue)
39
+ .anyMatch(v -> 2 <= v)
40
+ ;
41
+ }
42
+ private void dispose() {
43
+ while(hasDuplicateCards()) {
44
+ rankTable.entrySet().stream()
45
+ .filter(entry -> entry.getValue() >= 2)
46
+ .forEach(entry -> {
47
+ int rank = entry.getKey();
48
+
49
+ for(int i = 0; i < 2; ++i) {
50
+ removeCardByRank(rank);
51
+ }
52
+ })
53
+ ;
54
+ }
55
+ }
56
+
57
+ その他、必要なメソッド
58
+ }
59
+ ```
60
+
61
+ 疑似コードなのでこのままでは動きませんが。悪しからず。
62
+
63
+ ---
64
+ ところで、**半年以上前の回答**に急にマイナスが付くのは異常に思えます。
65
+ 確かに正確な回答ではありませんでしたが、**今日一日で6つもマイナス**が付いています。
66
+
67
+ この件は運営に連絡し、何か異常な動向が無いか調査していただくことにします。
68
+
69
+ 2018/1/30 までの回答
70
+ ---
1
71
  なんでマイナス?と思ってしばらく考えていましたが、
2
72
  よく考えたら要求は重複する要素の排除じゃないですね。失礼しました。
3
73
 

2

追記

2018/08/15 10:44

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,3 +1,8 @@
1
+ なんでマイナス?と思ってしばらく考えていましたが、
2
+ よく考えたら要求は重複する要素の排除じゃないですね。失礼しました。
3
+
4
+ 残骸
5
+ ---
1
6
  重複の除去のためによく使われるのが、一度集合に置き換える方法です。
2
7
  リスト ⇒ 集合 ⇒ リスト のように変換すれば重複する要素を取り除けます。
3
8
 

1

てにをは

2018/01/30 12:41

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,4 +1,4 @@
1
- 重複除去のためによく使われるのが、一度集合に置き換える方法です。
1
+ 重複除去のためによく使われるのが、一度集合に置き換える方法です。
2
2
  リスト ⇒ 集合 ⇒ リスト のように変換すれば重複する要素を取り除けます。
3
3
 
4
4
  『java list 重複 削除』とググればいろいろ出てきますよ。