簡體   English   中英

Java HashMap 為給定的鍵提供錯誤的值

[英]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;
}
  • dataMap 只需要在循環之外實例化一次。
  • 當您使用key 時,它應該是e ,您應該確保您發布的任何代碼都可以編譯(至少!)
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM