【问题标题】:How to Sort HashMap by value of Employee with Id? [duplicate]如何按具有 ID 的员工的值对 HashMap 进行排序? [复制]
【发布时间】:2018-12-22 05:39:32
【问题描述】:

我正在创建一个 Hashmap 对象,其键为员工姓名,值作为员工对象,其属性为姓名、ID 和年龄。如何使用员工 id 按值对 hashmap 进行排序?

【问题讨论】:

  • HashMap: "这个类不保证地图的顺序。"。
  • 哈希图是无序的。
  • 您可以使用TreeMap,这是一个排序的地图。
  • TreeMap: "地图按照其键的自然顺序排序,或者按照地图创建时提供的比较器排序。"。
  • 为什么要存储名称作为键?将 id 作为键存储不是更好吗(假设 id 始终是唯一的)?

标签: java


【解决方案1】:

您可以创建一个TreeMap 而不是Hashmap

将员工 id 作为 TreeMap 中的键,将员工对象作为值。(因为您想根据员工 id 进行排序,而员工 id 对于您的上下文来说似乎是唯一的。)

TreeMap<Integer, EmpObj> map = new TreeMap<>();

如果不能改变map id,可以按值对hashmap进行排序。 参考this link

【讨论】:

    【解决方案2】:

    Hashmap 不是为排序而设计的。有一个接口 SortedMap 及其实现之一 - TreeMap,但它对 keys 进行排序,而不是对值进行排序。因此,您的结果图将按员工姓名排序。

    另一方面,您可以使用LinkedHashMap 并根据您的规则插入新值,但我认为这不是您真正想要的。

    【讨论】:

      【解决方案3】:

      HashMaps 是无序的。将您的密钥设为Id。地图如下,

      Map<Integer, EmployeeDTO> map = new HashMap<>();
      

      您可以按如下方式对地图进行排序,

      SortedMap<Integer, EmployeeDTO> sortedMap = new TreeMap<Integer, EmployeeDTO>(map);
      

      如果你确实需要保持name作为key并按Id排序,如果你使用的是java 8,可以使用以下方式,

      Stream<Map.Entry<K,V>> sorted =
          map.entrySet().stream()
             .sorted(Map.Entry.comparingByValue(comparator));
      

      您可以创建的比较器,

      public class EmployeeComparator implements Comparator<EmployeeDTO>{
      
          @Override
          public int compare(EmployeeDTO employeeDTO1, EmployeeDTO employeeDTO2) {
      
              try {
                  if(employeeDTO1!=null && employeeDTO2!=null && 
                          employeeDTO1.getId()!=null && employeeDTO2.getId()!=null){
                      try {
                          return Integer.parseInt(employeeDTO1.getId()) - Integer.parseInt(employeeDTO2.getId());
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
      
              return 0;
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        是的,您可以按键排序。像其他人建议的那样,您可以使用 TreeMap 来保持您的键排序。

        例如,此代码将保持所有元素按其键排序:

        import java.util.Map;
        import java.util.TreeMap;
        
        public class Stack {
        
            public static void main(String args[]){
        
                TreeMap<Integer, String> map = new TreeMap<>();
                map.put(10,"Daniel");
                map.put(4,"Peter");
                map.put(1,"Claudia");
        
                for(Map.Entry<Integer,String> entry : map.entrySet()){
                    System.out.println(entry.getKey() +" -> "+entry.getValue());
                }
                /* it will print to console:
                1 -> Claudia
                4 -> Peter
                10 -> Daniel 
                */
            }
        }
        

        【讨论】:

        • 那么您将需要遍历所有元素并每次对其进行排序。如果您使用员工的 id 作为密钥可能会更好。没有?
        • @MKumar 我建议你使用 id 作为键。以这种方式,您可以避免通过键和 nlog 时间排序进行线性时间搜索
        猜你喜欢
        • 2012-09-26
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2023-03-28
        • 2015-02-13
        • 2018-06-06
        相关资源
        最近更新 更多