3

我正在查看各种google-collections(或 Apache commons collections)类,我希望在为我的用例找到最合适的 Map 实现方面得到一些帮助。我对国产地图不感兴趣。

以下是一些要求:

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

我知道ArrayListMultimap,但它没有公开满足我对 (B) 的要求的视图。

任何指针?

4

2 回答 2

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);
        }
    });
于 2013-05-02T10:03:21.670 回答
5

扩展@JonSkeet 的答案,我建议您使用番石榴ListMultimap作为您的(A)类型。这种类型可确保您始终将列表包含至少一个元素作为映射的一部分,并且该.asMap()方法返回一个为 a 的视图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);
  }

});
于 2013-05-02T10:28:42.363 回答