【问题标题】:Is there a way to get a tailMap or a headMap from an immutable Guava sorted multimap?有没有办法从不可变的 Guava 排序的多图中获取 tailMap 或 headMap?
【发布时间】:2021-10-21 11:11:02
【问题描述】:

在 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&lt;Integer, ImmutableList&lt;String&gt;&gt; 来获得这个功能?

【问题讨论】:

    标签: java guava treemap multimap


    【解决方案1】:

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

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

    对于生成的构建器生成的所有多图,Multimap.keySet() 可以安全地转换为SortedSetMultimap.asMap() 可以安全地转换为SortedMap。。 p>

    例子:

    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]}
    

    【讨论】:

    • 谢谢,但是有没有办法用ImmutableListMultimap 做到这一点?当我在 ImmutableListMultimap 上调用 toMap() 时,它会返回一个无法转换为 ImmutableSortedMap 的 RegularImmutableMap。
    • 在 Guava 中发现了类似的问题:github.com/google/guava/issues/3775
    • 是的,我认为您找到了关于不可变“排序多图”的正确问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2012-12-26
    • 2022-01-21
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多