Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在另一个映射中创建映射时遇到的问题_Java_Dictionary_Hashmap - Fatal编程技术网

Java-在另一个映射中创建映射时遇到的问题

Java-在另一个映射中创建映射时遇到的问题,java,dictionary,hashmap,Java,Dictionary,Hashmap,我正在尝试创建一个程序来跟踪一组不同的字符串,并用当前用户输入的名称(另一个字符串)将它们“绑定在一起”,这意味着每个人都应该有自己的钱包。我试着用另一张地图中的一张地图来做这件事,但这是我大脑超载的地方。如何将每个钱包绑定到正确的名称,然后显示所有这些内容?我代码中的注释给出了一个很好的例子。以下是我到目前为止的情况: Scanner sysin = new Scanner(System.in); boolean firstTime = true; Map<Str

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

    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();
    }
Scanner sysin=新扫描仪(System.in);
布尔值firstTime=true;
Map walletTracker=newhashmap();
Map nameTracker=newhashmap();
如果(!第一次){
/*此处应显示每个输入的姓名、钱包和存款时间,如下所示:
杰克:
钱夹:
[12345], [123456], [1234567]
JacksOtherWallet:
[123], [1234]
乔纳森:
琼斯瓦莱特:
[12345678]
*/
}
对于(int i=0;i<1;){
System.out.print(“输入您的姓名:”);
字符串名称=sysin.nextLine();
System.out.print(“请输入钱包名称:”);
String wallet=sysin.nextLine();
Set depositions=walletTracker.getOrDefault(名称,new HashSet());
add(System.currentTimeMillis());
walletTracker.put(钱包、存款);
name tracker.put(name,walletTracker);
System.out.println(“您成功地从“+钱包+”提取了资金。按enter继续…”);
第一次=错误;
字符串enter=sysin.nextLine();
}
Set depositions=walletTracker.getOrDefault(名称,new HashSet())

如果
name
没有映射,但没有将其添加到映射中,则返回
newhashset()
。您需要的是
.computeIfAbsent
,它将只返回与
名称
一起的映射,但如果它根本不存在,它将计算lambda,然后将其添加到映射中,然后返回:

Set<Long> deposits = walletTracker.computeIfAbsent(name, k -> new HashSet<>());
Set depositions=walletTracker.computeIfAbsent(名称,k->new HashSet());
这就是“lambda”语法——您不需要编写解析为新哈希集的表达式,而是编写解析为一个函数的表达式,该函数在提供键时会生成一个新哈希集(我们这里不需要它,它等于
name

Java风格的策略是至少创建一个
Wallet
类。一般来说,一旦你开始把
放进`,特别是当你有3层的深度时,停止,开始编写类

那应该是一张
地图
和一张
地图
或诸如此类的东西

Set depositions=walletTracker.getOrDefault(名称,new HashSet())

如果
name
没有映射,但没有将其添加到映射中,则返回
newhashset()
。您需要的是
.computeIfAbsent
,它将只返回与
名称
一起的映射,但如果它根本不存在,它将计算lambda,然后将其添加到映射中,然后返回:

Set<Long> deposits = walletTracker.computeIfAbsent(name, k -> new HashSet<>());
Set depositions=walletTracker.computeIfAbsent(名称,k->new HashSet());
这就是“lambda”语法——您不需要编写解析为新哈希集的表达式,而是编写解析为一个函数的表达式,该函数在提供键时会生成一个新哈希集(我们这里不需要它,它等于
name

Java风格的策略是至少创建一个
Wallet
类。一般来说,一旦你开始把
放进`,特别是当你有3层的深度时,停止,开始编写类


那应该是一张
地图
和一张
地图
或诸如此类的东西。

以下是我发现并注意到的:

  • if(!firstTime){}
    块应该在for循环中,以便在每次迭代中实际打印
  • 您试图使用
    walletTracker.getOrDefault(名称,newhashset())
    ,但
    名称
    变量不是此处使用的正确变量。您应该使用
    wallet
    输入变量
这是我的“打印”代码,与您建议的格式匹配:

nameTracker.forEach((姓名、钱包)->{
System.out.println(名称);
钱包。forEach((钱包名称、日期)->{
System.out.printf(“\t%s\n\t\t%s\n”,
walletName,Arrays.toString(dates.toArray(new Long[0]);
});
});
除此之外,用于实际填充地图的代码是正确的


@rzwitserloot就如何利用OOP为您提供了一些好的建议,我也会推荐这些建议。

以下是我的发现和注意事项:

  • if(!firstTime){}
    块应该在for循环中,以便在每次迭代中实际打印
  • 您试图使用
    walletTracker.getOrDefault(名称,newhashset())
    ,但
    名称
    变量不是此处使用的正确变量。您应该使用
    wallet
    输入变量
这是我的“打印”代码,与您建议的格式匹配:

nameTracker.forEach((姓名、钱包)->{
System.out.println(名称);
钱包。forEach((钱包名称、日期)->{
System.out.printf(“\t%s\n\t\t%s\n”,
walletName,Arrays.toString(dates.toArray(new Long[0]);
});
});
除此之外,用于实际填充地图的代码是正确的


@rzwitserloot就如何利用OOP为您提供了一些有益的建议,我也会推荐这些建议。

我知道代码行不会添加到地图中。这就是为什么我在下面用“walletTracker.put”。“walletTracker.getOrDefault”行仅用于从“wallet”变量获取所有字符串并放置t