【问题标题】:How can I sort a map contains another map by numbers如何按数字对包含另一张地图的地图进行排序
【发布时间】:2013-01-06 17:48:22
【问题描述】:

我有一个 HashMap 类型:

HashMap<String, HashMap<String, Integer>>

这个 HashMap 的值类似于

{name, {dateasString, numberOfTasks}} 

我想按numberOfTasks 对此进行排序。我找不到这样做的方法。

【问题讨论】:

  • 你能举一个具体的例子来说明你希望排序结果是什么吗?
  • 我认为您需要创建&lt;Integer, String&gt; 的第二张地图,基本上,将第二张地图 (&lt;String, Integer&gt;) 的内容复制到它上面并将其用作第二张地图的查找地图。我建议使用 TreeMap 之类的东西来让你的生活更简单

标签: java sorting collections hashmap


【解决方案1】:

我怀疑在 Java API 中是否有办法做到这一点。您必须手动完成,方法是在单独的模型中提取数据并对其进行排序,或者重新设计模型,以便更轻松地对该字段进行排序。

【讨论】:

    【解决方案2】:

    您必须将哈希图转换为数组。如果可以对哈希图进行排序,那么一开始就完全违背了使用哈希图的目的。

    hashMap.keySet().toArray(); // returns an array of keys
    hashMap.values().toArray(); // returns an array of values
    
    Arrays.sort(array); // sorts an array
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      创建您的自定义Comparator,根据对象的总和比较元素,并在使用数据填充列表/数组后使用Arrays.sort()Collections.sort()

      //populate example data:
      final Map<String,Map<String,Integer>> map = new HashMap<String, Map<String,Integer>>();
      map.put("x", new HashMap<String, Integer>());
      map.get("x").put("t1",1);
      map.get("x").put("t2",1);
      map.get("x").put("t3",1);
      map.put("y", new HashMap<String, Integer>());
      map.get("y").put("t1",2);
      map.get("y").put("t2",2);
      map.get("y").put("t3",2);
      map.put("z", new HashMap<String, Integer>());
      map.get("z").put("t1",3);
      map.get("z").put("t2",3);
      map.get("z").put("t3",3);
      
      //populate the data in a list:  
      List<String> list = new ArrayList<String>(map.keySet());
      
      //sort the data with a custom comparator:
      Collections.sort(list, new Comparator<String>() {
          private int getSum(String s) { 
              int sum = 0;
              for (Integer x : map.get(s).values()) {
                  if (x != null) sum += x;
              }
              return sum;
          }
          public int compare(String o1, String o2) {
              return new Integer(getSum(o1)).compareTo(new Integer(getSum(o2)));
          }
      });
      
      System.out.println(list);
      

      注意,为了提高性能,您可以使用缓存机制来避免在每次比较每个元素时重新计算每个元素的总和。

      【讨论】:

        【解决方案4】:

        第二个HashMap 必须是HashMap 吗?您可以将第二个HashMap 转换为专门用于此的类吗?也许是这样的:

        private class TaskList
        {
            String dateAsString;
            int numTasks;
            public TaskList(String dateAsString, int numTasks)
            {
                this.dateAsString = dateAsString;
                this.numTasks = numTasks;
            }
            public getDateAsString()
            {
                return dateAsString;
            }
            public getNumTasks()
            {
                return numTasks;
            }
        }
        

        然后您可以说HashMap&lt;String, TaskList&gt; 并直接访问任务数量并相应地对其进行排序。即使这样我也不认为HashMap 适合这个。

        【讨论】:

          【解决方案5】:

          你不能对HashMap 进行排序,但你可以获得一个排序后的数组(或列表) 按键。你想如何定义你的排序取决于你 - 只需修改 比较器(或它调用的numberOfTasks 函数:)

          所以是这样的?

          public static void main() {
              final
              HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();
          
              String[] keys = (String[]) map.keySet().toArray();
          
              Arrays.sort(keys, new Comparator<String>() {
                  @Override
                  public int compare(String k1, String k2) {
                      int v1 = numberOfTasks(map.get(k1));
                      int v2 = numberOfTasks(map.get(k2));
                      return Integer.valueOf(v1).compareTo(Integer.valueOf(v2));
                  }
              });
          
              // 'keys' is now sorted the way you want.
          
          }
          
          public static int numberOfTasks(HashMap<String, Integer> map) {
              int max = 0;
              for (Integer i : map.values()) {
                  if (i > max) max = i;
              }
              return max;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-08
            • 1970-01-01
            • 2012-04-25
            • 1970-01-01
            • 1970-01-01
            • 2012-04-13
            • 2021-09-13
            相关资源
            最近更新 更多