Как отсортировать значения Карты по ключу в Java?

Реляционная модель не содержит никаких физических связей. Одно отношение (таблица) может иметь ссылку на другое, используя пары «ключ - внешний ключ» («ключ» не может быть первичным). Для обеспечения целостности ссылок требуется ограничение внешнего ключа. Ограничение внешнего ключа должно использоваться в вашем дизайне «по умолчанию».

Обычно разработчик базы данных может добавить индекс для столбцов FK и не принимать во внимание любые другие проблемы с производительностью, поскольку они хорошо управляются в производственной среде (то есть временное отключение проверок FK, операции массовой загрузки игнорируют FK и т. Д.) .

342
задан informatik01 25 May 2018 в 07:01
поделиться

4 ответа

На всякий случай Вы не хотите использовать TreeMap

public static Map<Integer, Integer> sortByKey(Map<Integer, Integer> map) {
    List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
    list.sort(Comparator.comparingInt(Map.Entry::getKey));
    Map<Integer, Integer> sortedMap = new HashMap<>();
    list.forEach(e->map.put(e.getKey(), e.getValue()));
    return map;
}

кроме того, упаковывать Вас, хотел отсортировать Вашу карту на основе values просто изменение Map.Entry::getKey к Map.Entry::getValue

0
ответ дан 23 November 2019 в 00:33
поделиться

Краткий ответ

Используйте TreeMap . Именно для этого он нужен.

Если эта карта передана вам, и вы не можете определить тип, вы можете сделать следующее:

SortedSet<String> keys = new TreeSet<>(map.keySet());
for (String key : keys) { 
   String value = map.get(key);
   // do something
}

Это будет повторяться по карте в естественном порядке ключей.


Более длинный ответ

Технически, вы можете использовать все, что реализует SortedMap , но, за исключением редких случаев, это составляет TreeMap , так же как использование реализации Map обычно составляет HashMap .

Для случаев, когда ваши ключи являются сложным типом, который не реализует Comparable, или вы не хотите использовать естественный порядок, тогда TreeMap и TreeSet имеют дополнительные конструкторы, которые позволяют вы передаете Компаратор :

// placed inline for the demonstration, but doesn't have to be a lambda expression
Comparator<Foo> comparator = (Foo o1, Foo o2) -> {
        ...
    }

SortedSet<Foo> keys = new TreeSet<>(comparator);
keys.addAll(map.keySet());

Помните, что при использовании TreeMap или TreeSet характеристики производительности будут отличаться от характеристик HashMap или HashSet . Грубо говоря, операции поиска или вставки элемента будут идти от O (1) до O (Log (N)) .

В HashMap , переход от 1000 элементов к 10 000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap время поиска будет примерно в 3 раза медленнее (при условии, что Log 2 ). Переход от 1000 к 100000 будет примерно в 6 раз медленнее для каждого поиска элемента.

Грубо говоря, операции поиска или вставки элемента будут идти от O (1) до O (Log (N)) .

В HashMap , переход от 1000 элементов к 10 000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap время поиска будет примерно в 3 раза медленнее (при условии, что Log 2 ). Переход от 1000 к 100000 будет примерно в 6 раз медленнее для каждого поиска элемента.

Грубо говоря, операции поиска или вставки элемента будут идти от O (1) до O (Log (N)) .

В HashMap , переход от 1000 элементов к 10 000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap время поиска будет примерно в 3 раза медленнее (при условии, что Log 2 ). Переход от 1000 к 100000 будет примерно в 6 раз медленнее для каждого поиска элемента.

585
ответ дан 23 November 2019 в 00:33
поделиться

Предполагая, что TreeMap не хорошо для вас (и при условии, что вы не можете использовать дженерики):

List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.
133
ответ дан 23 November 2019 в 00:33
поделиться

Используйте TreeMap !

35
ответ дан 23 November 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: