2010-11-02 2 views
11

Какой структуры использовать, когда нужноРассортировано Карта с неоднородными ключами

  1. упорядочивания элементов по ключевому
  2. способности удерживать неуникальные ключи

    Structure<Integer, String> struct = new Structure<Integer, String>; 
    struct.add(3,"..."); 
    struct.add(1,"John"); 
    struct.add(2,"Edwin"); 
    struct.add(1,"Mary"); 
    struct.toString() == {key-> value;} [1->"John",1->"Mary",2->"Edwin",3->"..."] 
    

ответ

11

Если вы хотите использовать стандартный Java API, я бы выбрал TreeMap<Integer, Set<String>>.

  • Элементы упорядочены по ключам, так как это SortedMap. Из документов:

    Карта упорядочена в соответствии с естественным порядком ее ключей или компаратором, обычно предоставляемым на время сортировки карты. Этот порядок отражается при повторном просмотре видов сортированной карты (возвращаемых методами entrySet, keySet и значений).

  • Структура позволяет использовать не-уникальные ключи, поскольку вы можете позволить одной карте ключей нескольким объектам.

Этого типа структура называется отсортирован мульти-карта и есть несколько реализаций, которые скрывают подробности создания начальных наборов при вставке в первый раз и т.д. Взгляните на Guava или Apache Commons, например, ,

В зависимости от ваших потребностей вы также можете иметь SortedSet<Pair<Integer, String>>, где элементы сортируются по левому элементу в паре. (Обратите внимание, что вы сами должны были бы написать класс Pair, но это должно быть не более нескольких строк.)

+0

благодарит вас за подробный ответ – EugeneP

5

Похоже, вам нужно, возможно, Map<Integer, List<String>>, поэтому каждый ключ сопоставляется с списком (или другой коллекцией) строки.

У Apache Commons есть MultiMap, который делает это без лишних хлопот, кодирующих его.

MultiMap mhm = new MultiHashMap(); 
mhm.put(key, "A"); 
mhm.put(key, "B"); 
mhm.put(key, "C"); 
Collection coll = (Collection) mhm.get(key); 

coll будет сборником, содержащим «A», «B», «C».

Google Collections предоставит что-то подобное, я подозреваю.

+0

благодарит вас за подробный ответ – EugeneP

2

Помимо использования реализаций многоадресной печати из Apache Commons или Guava или реализации класса Pair, как предложено другими ответами, вы можете просто использовать TreeMap<Integer,List<String>>. Вместо сопоставления клавиш с одним String он теперь сопоставляется с List, который может содержать несколько значений и, таким образом, эффективно работать как мультимап.

Но я бы пошел с надлежащим multimap для производственного кода.

Смежные вопросы