Multimaps.index (), но производящий NavigableMap? - PullRequest
2 голосов
/ 30 марта 2011

Мне нужно то, что фактически ImmutableNavigableListMultimap<Integer, HasOffset>, где HasOffset выглядит так:

interface HasOffset {
   public int getOffset();
}

Но нет ImmutableNavigableListMultimap: я хочу неизменного NavigableMap<Integer, List<HasOffset>>, который я создаю из List<HasOffset>, где я индексирую каждый HasOffset по его смещению. Например, если бы у меня были эти объекты:

115 Elm St. John Smith
115 Elm St. Jane Smith
108 Elm St. Thomas Little
101 Elm St. Bill Jones
115 Elm St. Buster Smith
112 Elm St. Mary Kay
101 Elm St. Judy Jones

тогда мне нужна карта, которая выглядит как

101 -> [Bill Jones, Judy Jones]
108 -> [Thomas Little]
112 -> [Mary Kay]
115 -> [John Smith, Jane Smith, Buster Smith]    

где я могу использовать ключ и найти ближайшие значения ниже или выше этого ключа.

Может ли Гуава помочь или я застрял, делая это сам? Мне нравится Multimaps.index(), но я не думаю, что это поможет мне в этот раз.

Ответы [ 2 ]

4 голосов
/ 30 марта 2011

Guava по-прежнему является библиотекой Java 5, поэтому вы не найдете в ней ничего, реализующего Navigable*.

Если вы действительно этого хотите, вы можете подделать это, сначала отсортировав входные данные в Multimaps.index(), а затем используя ImmutableListMultimap представление keySet().asList(), выполняя двоичный поиск ключа и используя индекс, который он возвращает.Но, очевидно, это не то же самое.

Другой вариант, возможно, заключался бы в использовании Multimaps.index(), чтобы убрать скуку при создании карты, а затем скопировать ее asMap() представление в TreeMap<Integer, Collection<HasOffset>>.Очевидно, что здесь идет дополнительная работа по сравнению с тем, как ты делаешь это сам.

2 голосов
/ 05 апреля 2011

Вы можете создать TreeMultimap, у которого есть метод keySet(), возвращающий SortedSet.

Тогда самый большой ключ, меньший, чем данный ключ, равен multimap.keySet().headSet(key).last(), а самый маленький ключ больше, чемили равен данному ключу multimap.keySet().tailSet(key).first().Вы можете определить, какой из этих двух ключей ближе к ключу ввода, и получить его значения из мультикарты.

Вам придется обрабатывать случаи, когда клавиша ввода меньше всех мультикарт или больше всех.Когда головной или хвостовой набор пуст, методы last() и first() выдают NoSuchElementException.

...