首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换一个HashMap<Integer,Long> ito HashMap<Integer,Integer>

转换一个HashMap<Integer,Long> ito HashMap<Integer,Integer>
EN

Stack Overflow用户
提问于 2021-01-26 22:23:06
回答 3查看 556关注 0票数 2

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

代码语言:javascript
复制
private static Map<Integer, Long> countDuplicates(HashSet<Card> cards) {
    return cards.stream().collect(Collectors.groupingBy(Card::getRankNumber, Collectors.counting()));
}

是否有方法将结果MapMap<Integer, Long>转换为Map<Integer, Integer>

直接铸造使此例外情况出现:

代码语言:javascript
复制
Type mismatch: cannot convert from Map<Integer,Integer> to Map<Integer,Long>

注释:类的实现保证cards中有五个对象,因此没有溢出的可能性.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-26 22:29:42

尝试以下几点:

代码语言:javascript
复制
private static Map<Integer, Integer> countDuplicates(HashSet<Card> cards) {
    return cards.stream()
                .collect(Collectors.groupingBy(Card::getRankNumber, Collectors.summingInt(x -> 1)));
}

不要使用Collectors.counting(),而是使用Collectors.summingInt(x -> 1),这样您就可以立即获得作为整数的值。

票数 4
EN

Stack Overflow用户

发布于 2021-01-26 22:48:48

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

代码语言:javascript
复制
private static Map<Integer, Integer> countDuplicates(HashSet<Card> cards) {
    return cards.stream()
                .collect(Collectors.toMap(Card::getRankNumber, x -> 1, Integer::sum));
}
票数 2
EN

Stack Overflow用户

发布于 2021-01-27 00:18:37

梦中的答案亚历克斯·鲁登科的答复似乎都是正确的。下面是我为尝试这两种方法而编写的示例代码。

Card类。

代码语言:javascript
复制
package work.basil.example;

import java.util.Objects;

public class Card
{
    public enum Suit
    {
        CLUB, DIAMOND, HEART, SPADE
    }

    // -------------|  Member fields  |-----------------------
    private Suit suit;
    private String name;
    private Integer rankNumber;

    // -------------|  Constructors  |-----------------------
    public Card ( Suit suit , String name , Integer rankNumber )
    {
        Objects.requireNonNull( suit );
        Objects.requireNonNull( name );
        Objects.requireNonNull( rankNumber );
        this.suit = suit;
        this.name = name;
        this.rankNumber = rankNumber;
    }

    // -------------|  Getters  |-----------------------
    public String getName ( ) { return this.name; }

    public Integer getRankNumber ( ) { return this.rankNumber; }


    // -------------|  Object methods  |-----------------------

    @Override
    public String toString ( )
    {
        return "Card{ " +
                "suit=" + suit +
                " | name='" + name + '\'' +
                " | rankNumber=" + rankNumber +
                " }";
    }

    @Override
    public boolean equals ( Object o )
    {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;
        Card card = ( Card ) o;
        return suit == card.suit && getName().equals( card.getName() ) && getRankNumber().equals( card.getRankNumber() );
    }

    @Override
    public int hashCode ( )
    {
        return Objects.hash( suit , getName() , getRankNumber() );
    }
}

在Java16和更高版本中,我们可以将这个Card类简化为一个简短的record。在下面的代码中,我们将getRankNumber更改为隐式getter方法rankNumberSuit枚举将移动到它自己的.java文件中。

代码语言:javascript
复制
package work.basil.example.cardgame;

public record Card( Suit suit , String name , Integer rankNumber )
{
}

收集这些卡片的CastingStream类。

代码语言:javascript
复制
package work.basil.example;

import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class CastingStream
{
    public static void main ( String[] args )
    {
        CastingStream app = new CastingStream();
        app.demo();
    }

    private void demo ( )
    {
        Set < Card > cards = Set.of(
                new Card( Card.Suit.HEART , "Ten" , 10 ) ,
                new Card( Card.Suit.SPADE , "Ten" , 10 ) ,
                new Card( Card.Suit.HEART , "Queen" , 12 )
        );

        // Code taken from Question. https://stackoverflow.com/q/65910153/642706
        Map < Integer, Long > countDuplicatesLong =
                cards
                        .stream()
                        .collect(
                                Collectors.groupingBy(
                                        Card :: getRankNumber ,
                                        Collectors.counting()
                                )
                        );

        // Code taken from Answer by dreamcrash. https://stackoverflow.com/a/65910215/642706
        Map < Integer, Integer > countDuplicatesIntegerBySummingInt =
                cards
                        .stream()
                        .collect(
                                Collectors.groupingBy(
                                        Card :: getRankNumber ,
                                        Collectors.summingInt( x -> 1 )
                                )
                        );

        // Code taken from Answer by Alex Rudenko. https://stackoverflow.com/a/65910400/642706
        Map < Integer, Integer > countDuplicatesIntegerBySumMethodReference =
                cards
                        .stream()
                        .collect(
                                Collectors.toMap( Card :: getRankNumber ,
                                        x -> 1 ,
                                        Integer :: sum
                                )
                        );


        System.out.println( "cards = " + cards );
        System.out.println( "countDuplicatesLong = " + countDuplicatesLong );
        System.out.println( "countDuplicatesIntegerBySummingInt = " + countDuplicatesIntegerBySummingInt );
        System.out.println( "countDuplicatesIntegerBySumMethodReference = " + countDuplicatesIntegerBySumMethodReference );
    }
}

跑的时候。

代码语言:javascript
复制
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}
countDuplicatesIntegerBySummingInt = {10=2, 12=1}
countDuplicatesIntegerBySumMethodReference = {10=2, 12=1}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65910153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档