繁体   English   中英

有没有办法从不可变的 Guava 排序多映射中获取 tailMap 或 headMap?

[英]Is there a way to get a tailMap or a headMap from an immutable Guava sorted multimap?

Guava 中有几种方法可以创建排序的不可变 multiMap。 一种方法是首先创建一个 ListMultiMap,其中的键是一棵树,然后将它变成一个不可变的 multiMap。

使用 ListMultiMap 我们可以为同一个键创建重复的值:

ListMultimap<Integer, String> mutableMap = MultimapBuilder.treeKeys().arrayListValues().build();
return ImmutableListMultimap.copyOf(mutableMap);

使用 TreeMap 我们不会有相同键的重复值:

TreeMultimap<Integer, String> mutableMap = TreeMultimap.create(Ordering.natural(), Ordering.arbitrary());
return ImmutableListMultimap.copyOf(mutableMap);

问题在于,在这两种情况下,不可变接口都是通用的,并且没有提供以排序方式访问键的方法,因此我们可以拥有例如在 Java 的 NavigationalMap 中找到的 tailMap 和 headMap。

有没有办法在 Guava 中有一个不可变的排序多映射,它可以访问 tailMap 和 headMap? 或者我是否需要手动构建一个ImmutableSortedMap<Integer, ImmutableList<String>>来获得这个功能?

您可以将自定义ListMultimaptreeKeys()并投射生成的地图 - Guava 的合同保证它是安全的:

使用自然排序的TreeMap将键映射到值集合。 Multimap.keySet()Multimap.keys()Multimap.asMap()返回的集合将按排序顺序遍历键。

对于生成的构建器生成的所有多重映射, Multimap.keySet()可以安全地转换为SortedSet ,而Multimap.asMap()可以安全地转换为SortedMap

例子:

ListMultimap<Integer, String> multimap = MultimapBuilder.treeKeys().arrayListValues().build();
multimap.putAll(ImmutableMultimap.of(1, "one", 1, "uno", 2, "two", 42, "forty-two"));
// {1=[one, uno], 2=[two], 42=[forty-two]}

SortedMap<Integer, List<String>> sortedMap = (SortedMap<Integer, List<String>>) Multimaps.asMap(multimap); // safe, see javadoc
// `.asMap()` directly on `multimap` would give you SortedMap<Integer, Collection<String>>
// SortedMap<Integer, Collection<String>> sortedMap = (SortedMap<Integer, Collection<String>>) multimap.asMap();
SortedMap<Integer, List<String>> tailMap = sortedMap.tailMap(2);
// {2=[two], 42=[forty-two]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM