计算具有相同属性值的对象

时间:2015-04-22 22:10:53

标签: java hashmap java-8 java-stream

我正在创建一个扑克排名求解器,我必须在一组牌中计算同一套牌或同等级别的牌。在这里,我创建HashMap并在集合中有多个等级时增加值。

private boolean isFourOfAKind() {
        Map<RANK, Integer> rankDuplicates = new HashMap<>();
        for(Card card : cards) {
            rankDuplicates.put(card.getRank(), rankDuplicates.getOrDefault(card.getRank(), 0) + 1);
        }
        return rankDuplicates.containsValue(4);
    }

我想知道是否可以使用流与java流完全相同的事情。它看起来像这样:

    private boolean isFourOfAKind() {
        Map<RANK, Integer> rankDuplicates = cards.stream()
            .map(Card::getRank)
            .collect(Collectors.toMap(/*...something goes here..*/)); // of course this is very wrong, but you can see what I'm aiming at.
        return rankDuplicates.containsValue(4);
    }

2 个答案:

答案 0 :(得分:9)

看起来你正在寻找像

这样的东西
<div class="modal fade" id="pdfModal-<%= index %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">

答案 1 :(得分:5)

groupingBy的另一个变体:

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

...

private boolean isFourOfAKind() {
    return cards.stream()
                .collect(groupingBy(Card::getRank, counting()))
                .containsValue(4L);

}

基本上,您按照等级对卡片进行分组,以便您拥有Map<Rank, List<Card>>

然后使用下游收集器counting()将每个列表映射到其元素数量,以便最终结果为Map<Rank, Long>(您也可以使用summingInt(i -> 1)而不是{{} 1}}如果你真的需要一个counting())。