Java HashMap为给定的键提供了错误的值
我正在使用类型为Java HashMap为给定的键提供了错误的值,java,hashmap,hash-collision,Java,Hashmap,Hash Collision,我正在使用类型为Map的地图。填充映射后,如果我立即使用字符串键检索一些值,则返回的列表是正确的。但经过一段时间的迭代后,这些值正在发生变化 第一次填充地图后,我没有使用map.put任何地方,只使用了map.get() 私有映射createDataMap(列出员工列表){ (雇员e:雇员名单){ Map dataMap=newhashmap(); int-level=Integer.parseInt(如getLevel()); HashMap detailsMap=dataMap.get(级别
Map
的地图。填充映射后,如果我立即使用字符串
键检索一些值,则返回的列表
是正确的。但经过一段时间的迭代后,这些值正在发生变化
第一次填充地图后,我没有使用map.put
任何地方,只使用了map.get()
私有映射createDataMap(列出员工列表){
(雇员e:雇员名单){
Map dataMap=newhashmap();
int-level=Integer.parseInt(如getLevel());
HashMap detailsMap=dataMap.get(级别);
if(Objects.isNull(detailsMap)){
detailsMap=newhashmap();
数据映射。放置(级别、详细信息映射);
}
String deptName=key.getDepartment();
List keyList=detailsMap.get(deptName);
if(Objects.isNull(keyList)){
keyList=newarraylist();
detailsMap.put(数据映射键、键列表);
}
keyList.add(key);
}
返回数据图;
}
- dataMap只需在循环之外实例化一次李>
- 当您使用键时,它应该是e,您应该确保您发布编译的任何代码(至少!)
detailsMap.put(数据映射键、键列表)代码>不正确,应该是
detailsMap.put(e.getDepartment(),keyList)代码>
private static Map<Integer, HashMap<String, List<Employee>>> createDataMap2(List<Employee> employeeList) {
Map<Integer, HashMap<String, List<Employee>>> dataMap = new HashMap<>();
for(Employee e:employeeList){
// Get the departments for the employee's level
int level = Integer.parseInt(e.getLevel());
HashMap<String, List<Employee>> departmentsEmployeesMapForEmployeeLevel = dataMap.get(level);
if (Objects.isNull(departmentsEmployeesMapForEmployeeLevel)) {
departmentsEmployeesMapForEmployeeLevel = new HashMap<>();
dataMap.put(level, departmentsEmployeesMapForEmployeeLevel);
}
// Get the employee list for the employee's department
String deptName = e.getDepartment();
List<Employee> employeesListForEmployeeLevelAndDepartment = departmentsEmployeesMapForEmployeeLevel.get(deptName);
if (Objects.isNull(employeesListForEmployeeLevelAndDepartment)) {
employeesListForEmployeeLevelAndDepartment = new ArrayList<>();
departmentsEmployeesMapForEmployeeLevel.put(deptName, employeesListForEmployeeLevelAndDepartment);
}
// add the employee to its department list
employeesListForEmployeeLevelAndDepartment.add(e);
}
return dataMap;
}
提供您的代码?为了简化您的代码,您可以使用类
Map
的getOrDefault
,而不是在获取映射后测试映射的值是否为空。您的代码没有意义<代码>数据映射在循环中为每个员工构造,然后返回到循环外部。这甚至不会编译。通常,请查看处理条件创建逻辑的detailsMap=map.computeifassent(level,HashMap::New)
private static Map<Integer, HashMap<String, List<Employee>>> createDataMap2(List<Employee> employeeList) {
Map<Integer, HashMap<String, List<Employee>>> dataMap = new HashMap<>();
for(Employee employee: employeeList){
int level = Integer.parseInt(employee.getLevel());
String deptName = employee.getDepartment();
// get the list of department employees for level
HashMap<String, List<Employee>> departmentsEmployeesMapForEmployeeLevel =
dataMap.getOrDefault(level, new HashMap<>());
// get the list of employees for level and department
List<Employee> employeesListForEmployeeLevelAndDepartment =
departmentsEmployeesMapForEmployeeLevel.getOrDefault(deptName, new ArrayList<>());
// add employee to its department for its level
employeesListForEmployeeLevelAndDepartment.add(employee);
// set new employee list to the employee's department
departmentsEmployeesMapForEmployeeLevel.put(deptName, employeesListForEmployeeLevelAndDepartment);
// set the updated department to the employee's level
dataMap.put(level, departmentsEmployeesMapForEmployeeLevel);
}
return dataMap;
}