Реализация Map<String, List <String >>, отображающая представление Map из "последних значений"
Я смотрю на различные классы google-collection (или Apache commons collection) и думаю, что мне нужна помощь в поиске наиболее подходящей реализации Map для моего варианта использования. Меня не интересуют доморощенные карты.
Вот некоторые требования:
- у меня есть
Map<String, List<String>>
структура данных (А) - Большую часть времени я хочу выставить
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 ответа
Я подозреваю, что вы просто хотите 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);
}
});
Продолжая ответ @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);
}
});