Как сортировать ArrayList из HashMaps, в котором есть несколько пар ключ-значение?

Мне нужно вызвать внешний API с ArrayList из HashMaps, в котором есть несколько предопределенных пар ключ-значение. Пример:

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);
    }

Теперь мне нужно отсортировать эту конструкцию над содержимым ключа "значение". Этот тип приведет к тому, что запись "key = B key/value = A value" станет первой в массивеListHashMap.

Любая помощь приветствуется.

HJW

Ответ 1

Вам нужно реализовать 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"));

Ответ 2

(Это не ответ на заданный вопрос - Jon сделал это уже - но поле комментариев слишком мало для этого.)

Ваша структура данных выглядит так, как будто вы неправильно поняли структуру значений ключевых карт (и хэш-карты в вашем примере).

Карта может содержать любое количество ключей, а для каждой клавиши также значение. Пара ключей и значений задается параметром 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