Реляционная модель не содержит никаких физических связей. Одно отношение (таблица) может иметь ссылку на другое, используя пары «ключ - внешний ключ» («ключ» не может быть первичным). Для обеспечения целостности ссылок требуется ограничение внешнего ключа. Ограничение внешнего ключа должно использоваться в вашем дизайне «по умолчанию».
Обычно разработчик базы данных может добавить индекс для столбцов FK и не принимать во внимание любые другие проблемы с производительностью, поскольку они хорошо управляются в производственной среде (то есть временное отключение проверок FK, операции массовой загрузки игнорируют FK и т. Д.) .
На всякий случай Вы не хотите использовать 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
Используйте 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 раз медленнее для каждого поиска элемента.
В HashMap
, переход от 1000 элементов к 10 000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap
время поиска будет примерно в 3 раза медленнее (при условии, что Log 2 ). Переход от 1000 к 100000 будет примерно в 6 раз медленнее для каждого поиска элемента.
В HashMap
, переход от 1000 элементов к 10 000 на самом деле не влияет на ваше время поиска элемента, но для TreeMap
время поиска будет примерно в 3 раза медленнее (при условии, что Log 2 ). Переход от 1000 к 100000 будет примерно в 6 раз медленнее для каждого поиска элемента.
Предполагая, что TreeMap не хорошо для вас (и при условии, что вы не можете использовать дженерики):
List sortedKeys=new ArrayList(yourMap.keySet());
Collections.sort(sortedKeys);
// Do what you need with sortedKeys.