Сортированная карта с уникальными ключами

Какую структуру использовать, когда нужно

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

    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->"..."]
    

Ответ 1

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

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

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

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

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

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

Ответ 2

Похоже, вам понадобится 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 предоставит что-то подобное, я подозреваю.

Ответ 3

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

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