回答編集履歴
3
追記
    
        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
追記
    
        answer	
    CHANGED
    
    | @@ -1,3 +1,8 @@ | |
| 1 | 
            +
            なんでマイナス?と思ってしばらく考えていましたが、
         | 
| 2 | 
            +
            よく考えたら要求は重複する要素の排除じゃないですね。失礼しました。
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            残骸
         | 
| 5 | 
            +
            ---
         | 
| 1 6 | 
             
            重複の除去のためによく使われるのが、一度集合に置き換える方法です。
         | 
| 2 7 | 
             
            リスト ⇒ 集合 ⇒ リスト のように変換すれば重複する要素を取り除けます。
         | 
| 3 8 |  | 
1
てにをは
    
        answer	
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            重複 | 
| 1 | 
            +
            重複の除去のためによく使われるのが、一度集合に置き換える方法です。
         | 
| 2 2 | 
             
            リスト ⇒ 集合 ⇒ リスト のように変換すれば重複する要素を取り除けます。
         | 
| 3 3 |  | 
| 4 4 | 
             
            『java list 重複 削除』とググればいろいろ出てきますよ。
         | 
