我正在查看各种google-collections(或者还有Apache commons collections)类,我希望能为我的用例找到最合适的Map实现。我对本土地图不感兴趣。
以下是一些要求:
Map<String, List<String>>
数据结构(A)Map<String, String>
只读视图(B)。B.get(X) == A.get(X).get(A.get(X).size() - 1)
我知道ArrayListMultimap
,但它没有公开满足我对(B)要求的观点。
任何指针?
答案 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);
}
});