2009-03-19 5 views
238

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

Если все, что вы хотите сделать, выполняет итерацию одновременно, то Map.entrySet() позволит вам сделать это на любой карте. LinkedHashMap имеет четко определенный порядок, но для любой Карты набор записей отражает пары ключ/значение. –

+4

Этот код не является хорошим примером того, как любая реализация карты будет вести себя как ваш пример кода. отсортированы, упорядочены или нет. –

+0

Питер Лоури: Не могли бы вы рассказать об этом? Интерфейс карты возвращает ключи и значения в виде набора и коллекции соответственно. Заказ не гарантируется ни в одном из них, поэтому не кажется разумным говорить, что каждая реализация карты будет вести себя так же, как в моем примере кода. – Whatsit

ответ

306

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

Интерфейс имеет методы:

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

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

+1

пример: SortedMap map = new TreeMap <>(); – Ben

+5

Чтобы использовать TreeMap, требуется, чтобы класс ключей реализовал интерфейс Comparable. Если нет, тогда будет выведено какое-то исключение RuntimeException. TreeMap это также отсортированная карта, но я думаю, что автор хочет использовать только упорядоченную (не отсортированную) карту. LinkedHashMap - это хороший выбор для получения только упорядоченной карты (как вы сказали, «определяется порядком вставки»). –

162

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

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

+10

И просто сохранить читателя, дважды проверяя это, потому что его трудно проверить путем тестирования, 'keySet() 'эффективно возвращает LinkedHashSet, который отражает порядок вызовов' put() '. Обратите внимание, что повторные вызовы 'put()' для одного и того же ключа не изменят порядок, если вы заранее не уберете() ключ. –

6

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

+3

Я бы проголосовал за этот ответ, если бы подумал, что стоит потерять очки за это. Как указано выше, ваш ответ не содержит правильной информации о LinkedHashMap, и небольшое объяснение SortedMap было бы неплохо. – CorayThan

+0

@CorayThan, в этом случае вы повышаете лучшие ответы, а не публикуете другие, которые могут быть правильными, но не лучшими ... –

+1

Вот что я сделал. Просто говорю, что я могу понять, почему кто-то проголосует за него. – CorayThan

3

Вы можете использовать интерфейс NavigableMap, к которому можно получить доступ и пройти его по возрастанию или по убыванию. Этот интерфейс является intended to supersede интерфейсом 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) 
13

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

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

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). – ianaya89

+1

@ ianaya89 Я думаю, что это реальный ответ, но он очень похож на ответ [John Feminella's] (http://stackoverflow.com/a/663388/1677209)! – T30

+0

Если вы хотите получить упорядоченную карту, в которой записи хранятся в этом порядке, когда вы помещаете их в карту, чем правильный ответ LinkedHashMap. Если вы хотите отсортировать записи в своей независимой от карты форме, то заказ, в который вы их поместили, является правильным ответом SortedMap. – Ralph