如何对HashMaps的ArrayList分别保存几个键值对?

时间:2011-03-20 15:56:08

标签: java

我需要使用HashMaps的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

3 个答案:

答案 0 :(得分:36)

您需要实现Comparator<HashMap<String, String>>或更一般Comparator<Map<String, String>>,只提取与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"));

答案 1 :(得分:0)

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

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

Map可以包含任意数量的键,每个键也可以包含一个值。一对键和值由Map.Entry给出(可以通过地图的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

答案 2 :(得分:0)

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

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