【问题标题】:How sort an ArrayList of HashMaps holding several key-value pairs each?如何对每个包含多个键值对的 HashMap 的 ArrayList 进行排序?
【发布时间】:2011-03-20 15:56:07
【问题描述】:

我需要调用一个带有 HashMap 的 ArrayList 的外部 API,其中每个都包含几个预定义的键值对。一个例子:

ArrayList<HashMap<String, String>> arrayListHashMap = new ArrayList<HashMap<String, String>>();

    {
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put("key", "A key");
        hashMap.put("value", "B value");
        arrayListHashMap.add(hashMap);
    }

    {
        HashMap hashMap = new HashMap<String, String>();
        hashMap.put("key", "B key");
        hashMap.put("value", "A value");
        arrayListHashMap.add(hashMap);
    }

现在我需要根据“value”键的内容对该构造进行排序。这种排序将导致“key=B key/value=A value”条目作为 arrayListHashMap 中的第一个条目。

非常感谢任何帮助。

HJW

【问题讨论】:

    标签: java


    【解决方案1】:

    您需要实现Comparator&lt;HashMap&lt;String, String&gt;&gt; 或更一般的Comparator&lt;Map&lt;String, String&gt;&gt;,它只提取与value 键关联的值,然后使用Collections.sort。示例代码(对您想要排序的任何键进行概括):

    class MapComparator implements Comparator<Map<String, String>>
    {
        private final String key;
    
        public MapComparator(String key)
        {
            this.key = key;
        }
    
        public int compare(Map<String, String> first,
                           Map<String, String> second)
        {
            // TODO: Null checking, both for maps and values
            String firstValue = first.get(key);
            String secondValue = second.get(key);
            return firstValue.compareTo(secondValue);
        }
    }
    
    ...
    Collections.sort(arrayListHashMap, new MapComparator("value"));
    

    【讨论】:

    • 非常感谢您的快速答复。
    • 您好,如果我想根据一些自定义条件进行排序怎么办?就像我有一个值说 TEST 并且我希望对列表进行排序,以便所有 TEST 值首先出现,然后是其他所有值。所以基本上如果我有大小列表让我们说 10 并且如果它在位置 5 和 8 包含 TEST 值 2 次,那么我希望它们都在顶部。其他值将在那之后..你能告诉我怎么做吗..
    • @Scorpion:然后您编写一个比较器来检查 TEST 并始终将其视为比任何其他值更早的值。你觉得哪一点有困难? (这可能最好作为一个新问题......)
    • @JonSkeet 嗨,我遇到了类似的情况,我正在做你建议的任何事情,但我仍然得到“方法 sort(List, Comparator super T> ) 类型的集合不适用于参数 (ArrayList, MapComparator)" 知道如何解决这个问题吗?
    • @shubhamgupta:没有看到确切的代码,很难知道。我建议您提出一个新问题,并用一个简短但完整的示例来说明问题。
    【解决方案2】:

    您可以使用以下解决方案来实现它:

    arrayListHashMap.sort(Comparator.comparing(m -> m.get("value"), Comparator.nullsLast(Comparator.naturalOrder())));
    

    【讨论】:

      【解决方案3】:

      (这不是对所提问题的回答 - Jon 已经这样做了 - 但评论字段太小了。)

      您的数据结构看起来您误解了映射(以及您的示例中的哈希映射)的键值结构。

      一个 Map 可以包含任意数量的键,每个键也可以包含一个值。一对key和value由Map.Entry给出(可以通过map的entrySet()方法获得)。如果您想按键排序,只需使用 SortedMap(如 TreeMap)而不是通常的 HashMap。

      您正在通过 HashMap 来模拟各个条目,然后将它们全部放入 ArrayList ... :-/

      在你的例子中我会这样做:

      Map<String, String> map = new TreeMap<String, String>();
      map.put("B key", "B value");
      map.put("A key", "B value");
      
      System.out.println(map); // already sorted
      

      【讨论】:

      • 感谢您的回答。我需要提供外部 API - 这个想法不是我的。我所理解的是,它们模拟了数据库查询结果之类的东西。 ArrayList 是查询结果,每个 HashMap 是一条记录,每个条目是一个字段名和它的值。 “键”是一个字段,而“值”是另一个字段。似乎我应该为示例中的两个条目使用不同的名称。只需取“field1”和“field2”而不是“key”和“value”。很抱歉造成混乱。
      • 外部 API 实际上应该使用 javabean 列表。
      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 2011-09-20
      • 2015-04-22
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      相关资源
      最近更新 更多