首页 > 解决方案 > Java - 在另一个地图中创建地图时出现问题

问题描述

我正在尝试创建一个程序来跟踪一堆不同的字符串,并将它们与当前用户输入的名称(另一个字符串)“联系在一起”,这意味着每个人都应该有自己的钱包。我尝试使用另一个地图中的地图来做到这一点,但这是我的大脑超负荷的地方。我如何将每个钱包与正确的名称联系起来,然后显示所有这些?我的代码中的注释就是一个很好的例子。这是我到目前为止所拥有的:

    Scanner sysin = new Scanner(System.in);
    boolean firstTime = true;
    Map<String, Set<Long>> walletTracker = new HashMap<String, Set<Long>>();
    Map<String, Map<String, Set<Long>>> nameTracker = new HashMap<String, Map<String, Set<Long>>>();
    
    if(!firstTime) {
        /* Here it should display every entered name, wallet and time of deposit, like this:
        
        Jack:
            JacksWallet:
                [12345], [123456], [1234567]
            JacksOtherWallet:
                [123], [1234]
        Jonathan:
            JonsWallet:
                [12345678]
        */
    }
    
    for(int i = 0; i < 1;) {
        System.out.print("Enter your name: ");
        String name = sysin.nextLine();
        System.out.print("Please enter a wallet name: ");
        String wallet = sysin.nextLine();
        
        Set<Long> deposits = walletTracker.getOrDefault(name, new HashSet<>());
        deposits.add(System.currentTimeMillis());
        walletTracker.put(wallet, deposits);
        nameTracker.put(name, walletTracker);
        
        System.out.println("You successfully withdrew money from "+ wallet +". Press enter to continue...");
        firstTime = false;
        String enter = sysin.nextLine();
    }

标签: javadictionaryhashmap

解决方案


Set<Long> deposits = walletTracker.getOrDefault(name, new HashSet<>());

new HashSet<>()如果没有映射,则返回,name不会将其添加到映射中。您想要的是.computeIfAbsent,它只会返回与 一起出现的映射name,但如果它根本不存在,它会评估您的 lambda,然后将其添加到映射中,然后返回:

Set<Long> deposits = walletTracker.computeIfAbsent(name, k -> new HashSet<>());

那是'lambda'语法 - 你不写一个解析为新哈希集的表达式,你写一个解析为一个函数的表达式,当提供密钥时产生一个新的哈希集(我们在这里不需要,并且是name无论如何都等于)。

这里的 Java 式策略是Wallet至少创建一个类。一般来说,一旦你开始放入<>`<>,尤其是当你有 3 个级别的深度时,停止并开始编写类。

那应该是一个Map<String, Wallet>和一个Map<String, Person>或诸如此类的东西。


推荐阅读