Упорядоченная карта Java - PullRequest
285 голосов
/ 19 марта 2009

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

Ответы [ 8 ]

353 голосов
/ 19 марта 2009

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

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

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

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

193 голосов
/ 19 марта 2009

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

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

17 голосов
/ 06 января 2015

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

java.util.LinkedHashMap, похоже, работает так же, как обычный HashMap в противном случае.

6 голосов
/ 19 марта 2009

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

4 голосов
/ 23 июня 2014

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

Существует три наиболее полезных реализации: 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)
3 голосов
/ 06 июня 2012

Начиная с Java 6 существует неблокирующая поточно-ориентированная альтернатива TreeMap . См. ConcurrentSkipListMap .

3 голосов
/ 19 марта 2009

Я думаю, что интерфейс 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

0 голосов
/ 08 октября 2018

Я использовал Простую хеш-карту, связанный список и коллекции для сортировки карты по значениям.

import java.util.*;
import java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

Вывод:

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...