Java 转换哈希映射<;整数,长>;伊藤哈希图<;整数,整数>;

Java 转换哈希映射<;整数,长>;伊藤哈希图<;整数,整数>;,java,casting,integer,long-integer,collectors,Java,Casting,Integer,Long Integer,Collectors,Collectors.counting()返回此方法中每个键的long值: private static Map<Integer, Long> countDuplicates(HashSet<Card> cards) { return cards.stream().collect(Collectors.groupingBy(Card::getRankNumber, Collectors.counting())); } 注意:我的类的实现保证卡中有五个对象,因此没

Collectors.counting()
返回此方法中每个键的
long
值:

private static Map<Integer, Long> countDuplicates(HashSet<Card> cards) {
    return cards.stream().collect(Collectors.groupingBy(Card::getRankNumber, Collectors.counting()));
}
注意:我的类的实现保证
卡中有五个对象,因此没有溢出的机会。

尝试以下操作:

private static Map<Integer, Integer> countDuplicates(HashSet<Card> cards) {
    return cards.stream()
                .collect(Collectors.groupingBy(Card::getRankNumber, Collectors.summingInt(x -> 1)));
}
私有静态映射计数重复(哈希集卡){
返回卡。流()
.collect(Collectors.groupingBy(Card::getRankNumber,Collectors.summingit(x->1));
}

不要使用
collector.counting()
而使用
collector.summingit(x->1)
,这样您可以立即将值作为整数获取。

另一种获取
Map
的方法是使用
toMap
收集器和
Integer::sum
作为合并函数:

私有静态映射计数重复(哈希集卡){
返回卡。流()
.collect(Collectors.toMap(Card::getRankNumber,x->1,Integer::sum));
}
和似乎都正确。下面是我为尝试这两种方法而编写的示例代码

package work.basil.example;
导入java.util.Objects;
公务舱卡
{
公开枚举诉讼
{
棍棒、钻石、心脏、黑桃
}
//---------成员字段|-----------------------
私人诉讼;
私有字符串名称;
私有整数;
//---------施工人员|-----------------------
公共卡(套装、字符串名称、整数编号)
{
对象。要求不完整(套装);
对象。requirennull(名称);
对象。requireNonNull(rankNumber);
这套衣服;
this.name=名称;
this.rankNumber=rankNumber;
}
//---------吸气剂|-----------------------
公共字符串getName(){返回this.name;}
公共整数getRankNumber(){返回this.rankNumber;}
//---------对象方法|-----------------------
@凌驾
公共字符串toString()
{
返回“卡片{”+
“suit=“+suit”+
“| name=”+name+“\”+
“| rankNumber=“+rankNumber+
" }";
}
@凌驾
公共布尔等于(对象o)
{
如果(this==o)返回true;
如果(o==null | | getClass()!=o.getClass())返回false;
卡片=(卡片)o;
return suit==card.suit&&getName().equals(card.getName())&&getRankNumber().equals(card.getRankNumber());
}
@凌驾
公共整数哈希代码()
{
返回Objects.hash(suit,getName(),getRankNumber());
}
}
在Java16和更高版本中,我们可以将
Card
类简化为一个简短的类。在下面的代码中,我们将
getRankNumber
更改为隐式getter方法
rankNumber
Suit
enum将移动到它自己的.java文件中

package work.basil.example.cardgame;
公共记录卡(套装、字符串名称、整数编号)
{
}
CastingStream
类收集这些卡

package work.basil.example;
导入java.util.Map;
导入java.util.Set;
导入java.util.stream.collector;
公共级CastingStream
{
公共静态void main(字符串[]args)
{
CastingStream应用程序=新建CastingStream();
app.demo();
}
私有void演示()
{
集合<卡片>卡片=集合(
新卡片(卡片、套装、心形,“十”,10),
新牌(牌、套、黑桃、十、十),
新卡片(卡片、套装、心形,“女王”,12)
);
//代码取自问题。https://stackoverflow.com/q/65910153/642706
Mapcountreplicateslong=
卡
.stream()
.收集(
收集者分组(
卡片::getRankNumber,
3.计数()
)
);
//代码取自dreamcrash的答案。https://stackoverflow.com/a/65910215/642706
映射<整数,整数>计数重复项到EGERBYSUMMINGIT=
卡
.stream()
.收集(
收集者分组(
卡片::getRankNumber,
收集器.总和(x->1)
)
);
//代码取自Alex Rudenko的答案。https://stackoverflow.com/a/65910400/642706
Mapcountreplicatesintegerbysummamethodreference=
卡
.stream()
.收集(
收集器.toMap(卡::getRankNumber,
x->1,
整数::和
)
);
System.out.println(“cards=“+cards”);
System.out.println(“countDuplicatesLong=“+countDuplicatesLong”);
System.out.println(“countreplicatesintegerbysummingit=“+countreplicatesintegerbysummingit”);
System.out.println(“countDuplicatesIntegerBySumMethodReference=“+countDuplicatesIntegerBySumMethodReference”);
}
}
跑步的时候

cards=[Card{suit=HEART | name='Queen'| rankNumber=12},Card{suit=HEART | name='Ten'| rankNumber=10},Card{suit=SPADE | name='Ten'| rankNumber=10}]
countDuplicatesLong={10=2,12=1}
CountDuplicateStegerBySummingit={10=2,12=1}
CountDuplicateStegerBySummethodReference={10=2,12=1}

LOL如果最后的结果不一样,那会很尴尬
private static Map<Integer, Integer> countDuplicates(HashSet<Card> cards) {
    return cards.stream()
                .collect(Collectors.groupingBy(Card::getRankNumber, Collectors.summingInt(x -> 1)));
}