[英]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>>
来获得这个功能?
您可以将自定义ListMultimap
与treeKeys()
并投射生成的地图 - 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.