Map <string,list <string =“”>&gt;实现,公开一个视图Map“last values”</string,>

时间:2013-05-02 09:59:35

标签: java guava apache-commons-collection

我正在查看各种google-collections(或者还有Apache commons collections)类,我希望能为我的用例找到最合适的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)要求的观点。

任何指针?

2 个答案:

答案 0 :(得分: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);
        }
    });

答案 1 :(得分: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);
  }

});