首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -在另一个Map中创建Map的问题

Java -在另一个Map中创建Map的问题
EN

Stack Overflow用户
提问于 2021-04-23 02:07:35
回答 2查看 81关注 0票数 0

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

代码语言:javascript
复制
    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();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 02:37:34

下面是我发现和注意到的:

  • if(!firstTime) {}块应该在for循环中,以便在每次迭代中实际打印。
  • 您尝试使用walletTracker.getOrDefault(name, new HashSet<>());,但是name变量不是这里使用的正确变量。您应该使用wallet输入变量.

下面是我的“打印出来”代码,与建议的格式相匹配:

代码语言:javascript
复制
nameTracker.forEach((name, wallet) -> {
    System.out.println(name);
    wallet.forEach((walletName, dates) -> {
        System.out.printf("\t%s\n\t\t%s\n",
            walletName, Arrays.toString(dates.toArray(new Long[0])));
    });
});

除此之外,用于实际填充映射的代码是正确的。

@rzwitserloot对使用OOP给出了一些好处,我也会推荐这些建议。

票数 1
EN

Stack Overflow用户

发布于 2021-04-23 02:34:35

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

如果没有name的映射,则返回name,但不会将它添加到映射中。您需要的是.computeIfAbsent,它将只返回与name一起的映射,但是如果它根本不存在,它将对lambda进行评估,然后将其添加到映射中,然后返回该值:

代码语言:javascript
复制
Set<Long> deposits = walletTracker.computeIfAbsent(name, k -> new HashSet<>());

这是“lambda”语法--您不编写解析为新哈希集的表达式,而是编写解析为在提供密钥时生成新哈希集的函数的表达式(我们这里不需要该表达式,并且无论如何等于name )。

这里的Java策略是至少创建一个Wallet类。通常,一旦您开始将<>放入`<>中,特别是如果您有3层深度,就停止编写类,然后开始编写类。

那应该是Map<String, Wallet>Map<String, Person>之类的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67223063

复制
相关文章

相似问题

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