Multimaps.index()但生成NavigableMap?

时间:2011-03-30 17:11:52

标签: java map guava

我需要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 个答案:

答案 0 :(得分:4)

Guava仍然是一个Java 5库,因此您不会在其中找到任何实现Navigable*的内容。

如果你真的想要,你可以通过首先将输入排序为Multimaps.index(),然后利用ImmutableListMultimap的{​​{1}}视图并进行二分搜索一个键并利用它返回的索引。但这显然不一样。

另一种选择可能是使用keySet().asList()来消除创建地图的乏味,然后将其Multimaps.index()视图复制到asMap()。显然,除了自己动手之外,还有一些额外的工作要做。

答案 1 :(得分:2)

您可以创建一个TreeMultimap,其keySet()方法返回SortedSet

然后,小于给定键的最大键是multimap.keySet().headSet(key).last(),而大于或等于给定键的最小键是multimap.keySet().tailSet(key).first()。您可以确定这两个键中的哪一个更接近输入键并从多图中检索其值。

您必须处理输入键小于所有多映射键或大于所有多映射键的情况。当head set或tail set为空时,last()first()方法会抛出NoSuchElementException