Java中基于二维数组创建双键Map的实现问题求助
问题分析与解决方案
你遇到的问题核心是对Java Map的键值对应逻辑理解有偏差,再加上没准确捕捉到断言要求的数据结构~我来一步步帮你理清:
为什么原代码只保留最后一个值?
Java里的HashMap<String, String>是单值映射:每个键(比如"firstname")只能对应一个值。你原代码里三次循环反复对同一个键执行put操作,每次都会覆盖掉之前存储的值,所以循环结束后,每个键自然就只剩二维数组最后一行的对应内容了。
断言要求的是什么数据结构?
从断言代码phoneBook2.get(0).get("firstname")能看出来,phoneBook2需要是一个嵌套Map:
- 外层Map的键是二维数组的索引(
Integer类型),值是另一个Map; - 内层Map的键是
"firstname"、"surname"、"phoneNumber",对应存储每一行数组的三个元素。
这样外层Map的size()就等于二维数组的行数(也就是断言要求的100),完全匹配需求。
正确的代码实现
// 定义嵌套Map:外层用数组索引作为键,内层存储单个用户的完整信息 Map<Integer, Map<String, String>> phoneBook2 = new HashMap<>(); for (int i = 0; i < phoneBook.length; i++) { // 为当前行创建一个内层Map,存放三个字段 Map<String, String> userDetails = new HashMap<>(); userDetails.put("firstname", phoneBook[i][0]); userDetails.put("surname", phoneBook[i][1]); userDetails.put("phoneNumber", phoneBook[i][2]); // 将索引和用户信息存入外层Map phoneBook2.put(i, userDetails); }
匹配断言的验证逻辑
phoneBook2.get(0)会取出索引0对应的内层Map,再调用.get("firstname")就正好等于phoneBook[0][0],完美匹配第一个断言;- 同理,
phoneBook2.get(0).get("surname")和phoneBook2.get(0).get("phoneNumber")也会对应数组第一行的后两个元素; - 外层Map的
size()等于二维数组的行数,也就是100,完全符合最后一个断言的要求。
内容的提问来源于stack exchange,提问作者adrc11
相关产品推荐
相关产品推荐

