Есть ли в Java объект, который действует как карта для хранения и доступа к парам ключ / значение, но может возвращать упорядоченный список ключей и упорядоченный список значений, чтобы списки ключей и значений были в одном и том же порядке?
В качестве объяснения по коду я ищу что-то похожее на мой вымышленный OrderedMap:
OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");
String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();
for(int i = 0; i < keys.size(); i++)
{
Integer key = keys.get(i);
String value = values.get(i);
Assert(om.get(key) == value);
}
java
collections
Что это
источник
источник
LinkedHashMap
.Ответы:
Интерфейс SortedMap (с реализацией TreeMap ) должен быть вашим другом.
Интерфейс имеет методы:
keySet()
который возвращает набор ключей в порядке возрастанияvalues()
который возвращает коллекцию всех значений в порядке возрастания соответствующих ключейТак что этот интерфейс полностью соответствует вашим требованиям. Однако ключи должны иметь осмысленный порядок. В противном случае вы можете использовать LinkedHashMap, где порядок определяется порядком вставки.
источник
LinkedHashMap
чей порядок итераций равен порядку, в котором к последним элементам обращалисьLinkedHashMap
порядок итераций - порядок вставки, но вы можете использовать другой конструктор, чтобы указать порядок доступа. docs.oracle.com/javase/8/docs/api/java/util/...Вы ищете java.util.LinkedHashMap . Вы получите список пар Map.Entry <K, V> , которые всегда повторяются в одном и том же порядке. Этот порядок совпадает с порядком, в котором вы помещаете элементы. В качестве альтернативы используйте java.util.SortedMap , где ключи должны либо иметь естественный порядок, либо указывать его с помощью
Comparator
.источник
keySet()
метод эффективно возвращает LinkedHashSet, который отражает порядок вашихput()
вызовов. Обратите внимание, что повторные вызовыput()
для одного и того же ключа не изменят порядок, если вы неremove()
нажали ключ заранее.LinkedHashMap
чей порядок итерации - это порядок, к которому в последний раз обращались к его записямLinkedHashMap поддерживает порядок ключей.
java.util.LinkedHashMap, кажется, работает так же, как обычный HashMap в противном случае.
источник
Я думаю, что ближайшая коллекция, которую вы получите из фреймворка, это SortedMap
источник
Вы можете использовать интерфейс NavigableMap, к которому можно получить доступ и пройти в порядке возрастания или убывания ключа. Этот интерфейс предназначен для замены интерфейса SortedMap. Навигационная карта обычно сортируется в соответствии с естественным порядком ее ключей или с помощью компаратора, предоставляемого во время создания карты.
Существует три наиболее полезных реализации этого: TreeMap , ImmutableSortedMap и ConcurrentSkipListMap .
Пример TreeMap:
Вывод:
источник
Я думаю, что интерфейс SortedMap реализует то, что вы просите, и TreeMap реализует это.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
источник
Начиная с Java 6 существует неблокирующая поточно-ориентированная альтернатива TreeMap . Смотрите ConcurrentSkipListMap .
источник
ТЛ; др
Чтобы сохранить
Map< Integer , String >
порядок, отсортированный по ключу, используйте любой из двух классов, реализующих интерфейсыSortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Если вы манипулируете картой внутри одного потока, используйте первый
TreeMap
,. При манипулировании потоками используйте второеConcurrentSkipListMap
,.Для получения дополнительной информации см. Таблицу ниже и последующее обсуждение.
подробности
Вот графическая таблица, которую я сделал, показывающий возможности десяти
Map
реализаций, связанных с Java 11.NavigableMap
Интерфейс , чтоSortedMap
должно быть в первую очередь.SortedMap
Логически должны быть удалены , но не может быть , как некоторые карты реализации третьей стороны может использовать интерфейс.Как видно из этой таблицы, только два класса реализуют интерфейсы
SortedMap
/NavigableMap
:TreeMap
ConcurrentSkipListMap
Оба из них хранят ключи в отсортированном порядке, либо в их естественном порядке (используя
compareTo
методComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) или черезComparator
реализацию, которую вы передаете. Разница между этими двумя классами заключается в том, что второй классConcurrentSkipListMap
является потокобезопасным и очень параллельным .См. Также столбец « Порядок итераций» в таблице ниже.
LinkedHashMap
Класс возвращает свои записи по порядку , в котором они были первоначально вставлены .EnumMap
возвращает записи в порядке, в котором определяется класс перечисления ключа . Например, карта того, какой сотрудник покрывает, какой день недели (Map< DayOfWeek , Person >
) используетDayOfWeek
класс enum, встроенный в Java. Это перечисление определяется первым понедельником и последним воскресеньем. Таким образом, записи в итераторе будут появляться в таком порядке.Другие шесть реализаций не дают никаких обещаний относительно порядка, в котором они сообщают свои записи.
источник
Я использовал карту Simple Hash, связанный список и коллекции для сортировки карты по значениям.
Выход:
источник