Карта заказа Java

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

Ответ 1

Интерфейс SortedMap (с реализацией TreeMap) должен быть вашим другом.

Интерфейс имеет следующие методы:

  • keySet(), который возвращает набор ключей в порядке возрастания
  • values(), который возвращает коллекцию всех значений в порядке возрастания соответствующих клавиш

Таким образом, этот интерфейс точно соответствует вашим требованиям. Однако ключи должны иметь значимый порядок. В противном случае вы можете использовать LinkedHashMap, где порядок определяется порядком вставки.

Ответ 2

Есть ли объект, который действует как Карта для хранения и доступа к парам ключ/значение, но может возвращать упорядоченный список ключей и упорядоченный список значений, так что списки ключей и значений находятся в одном порядке?

Вы ищете java.util.LinkedHashMap. Вы получите список пар Map.Entry < K, V > , которые всегда повторяются в одном и том же заказ. Этот порядок совпадает с порядком, в который вы помещаете элементы. В качестве альтернативы используйте java.util.SortedMap, где ключи должны либо иметь естественный порядок, либо задать его Comparator.

Ответ 3

LinkedHashMap поддерживает порядок ключей.

java.util.LinkedHashMap работает как обычный HashMap.

Ответ 4

Я думаю, что ближайшая коллекция, которую вы получите из фреймворка, - SortedMap

Ответ 6

Так как Java 6 также неблокирует потокобезопасную альтернативу TreeMap. См. ConcurrentSkipListMap.

Ответ 7

Вы можете использовать NavigableMap интерфейс, к которому можно получить доступ и пройденный в порядке возрастания или по убыванию. Этот интерфейс предназначен для замены > интерфейса SortedMap. Карта Navigable обычно сортируется в соответствии с естественным порядком ее ключей или компаратором, предоставленным при создании карты.

Есть три наиболее полезные реализации: TreeMap, ImmutableSortedMap и ConcurrentSkipListMap.

Пример TreeMap:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

Вывод:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)