Реализация 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);
  }

});
Другие вопросы по тегам