[英]Java HashMap gives wrong values for the given key
我正在使用Map<Integer, HashMap<String, List<Employee>>>
類型的Map<Integer, HashMap<String, List<Employee>>>
。 填充地圖后,如果我立即使用String
鍵檢索一些值,則返回的List<Employee>
是正確的。 但是經過一些迭代后,這些值正在發生變化。
第一次填充地圖后,我沒有在任何地方使用map.put
,只使用了map.get()
。
private Map<Integer, HashMap<String, List<Employee>>> createDataMap(List<Employee> employeeList) {
for(Employee e:employeeList){
Map<Integer, HashMap<String, List<Employee>>> dataMap = new HashMap<>();
int level = Integer.parseInt(e.getLevel());
HashMap<String, List<Employee>> detailsMap = dataMap.get(level);
if (Objects.isNull(detailsMap)) {
detailsMap = new HashMap<>();
dataMap.put(level, detailsMap);
}
String deptName = key.getDepartment();
List<Employee> keyList = detailsMap.get(deptName);
if (Objects.isNull(keyList)) {
keyList = new ArrayList<>();
detailsMap.put(dataMapKey, keyList);
}
keyList.add(key);
}
return dataMap;
}
detailsMap.put(dataMapKey, keyList);
不正確,應該是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
進一步簡化。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.