Map <String,List <String >>实现,公开视图Map"last values"

Luk*_*der 3 java guava apache-commons-collection

我正在查看各种google-collections(或者也就是Apache commons集合)类,我希望在为我的用例找到最合适的Map实现方面有所帮助.我对本土地图不感兴趣.

以下是一些要求:

  • 我有一个Map<String, List<String>>数据结构(A)
  • 大多数时候,我想暴露一个Map<String, String>只读视图(B).
  • (B)特点:
    • (B)中的键对应于(A)中的键
    • (B)中的值对应于"(A)中的最后值",即 B.get(X) == A.get(X).get(A.get(X).size() - 1)
    • (A)中的值可能不是空列表

我知道ArrayListMultimap,但它没有公开满足我对(B)要求的观点.

有什么指针吗?

Jon*_*eet 12

我怀疑你只想要Maps.transformValues番石榴:

Map<String, String> lastValueView = Maps.transformValues(originalMap,
    new Function<List<String>, String>() {
        @Override
        public String apply(List<String> input) {
            return input.get(input.size() - 1);
        }
    });
Run Code Online (Sandbox Code Playgroud)


nd.*_*nd. 5

根据@ JonSkeet的回答,我建议你使用Guava ListMultimap作为你的(A)类型.此类型确保您始终具有至少一个元素作为地图的一部分的列表,并且该.asMap()方法返回一个视图Map<String, List<String>>(即使签名没有这样说).

Maps.transformValues方法还返回一个视图,因此源地图中的更改将反映在目标地图中.但请注意,"返回的映射不是线程安全的或可序列化的,即使底层映射是.":

ListMultimap<String, String> source = ArrayListMultimap.create();
Map<String, String> target = Maps.transformValues(source.asMap(), new Function<Collection<String>, String>() {

  @Override
  public String apply(Collection<String> input) {
    return Iterables.getLast(input);
  }

});
Run Code Online (Sandbox Code Playgroud)

  • @ lukas-eder Iterables.getLast足够聪明的参数使用iterable.get(iterable.size() - 1)用于所有可迭代的实例List(以及所有可迭代实例的SortedSet的iterable.last()) (2认同)