Может ли Карта также быть Коллекцией? - PullRequest
3 голосов
/ 26 января 2012

Я хотел бы иметь Карту, которая также является Коллекцией.Или, более конкретно, я хотел бы иметь возможность перебирать записи на карте, включая случай, когда для определенного ключа есть несколько записей.

Конкретная проблема, которую я пытаюсь решить, заключается в предоставленииобъект, который можно использовать в jstl как для перебора, используя c:forEach, так и в выражении типа ${a.b.c}.В этом примере я бы хотел, чтобы ${a.b.c} оценил первое значение c (или ноль, если их нет), но также мог бы выполнять итерацию по всем c с <c:forEach items="${a.b.c}"> и иметьтело цикла видит каждое отдельное значение c по очереди, хотя они имеют одинаковый ключ на карте.

Если смотреть на вещи с точки зрения метода, это должно быть просто, просто предоставьте реализацию Map, метод entrySet() которой возвращает набор с несколькими записями с одним и тем же ключом.Но так как это, кажется, нарушает контракт Карты, все ли изменится тонким, но катастрофическим образом?Кто-нибудь еще делал подобные вещи?

(Если бы вы догадались, что я пытаюсь представить xml, вы были бы правы)

РЕДАКТИРОВАТЬ

Обратите внимание, что это для использования в jstl, поэтому любой интерфейс, который я представляю, должен удовлетворять 2 условиям:

  • для использования с операторами [] и ., это должно быть Map, List, массив или объект JavaBeans (и из тех, что он не может быть списком или массивом, поскольку индексы не будут числами)
  • для использования с forEach это должен быть массив, Collection, Iterator, Enumeration, Map или String.

Так что, я думаю, реальный вопрос в том, могу ли я рассчитывать только на jstl , звонящем .containsKey(), .get() и .entrySet() и не заботятся о нарушении инвариантов, а также не создают внутреннюю копию карты, которая не сохранит особого поведения итерации.

Ответы [ 4 ]

5 голосов
/ 26 января 2012

То, что вы ищете, это Multimap . Guava предоставляет его реализацию, и, в частности, вы ищете ArrayListMultimap .

0 голосов
/ 26 января 2012

как насчет использования Карты с Коллекциями в качестве значений? тогда у вас могут быть разные значения для одного и того же ключа, и вы можете перебирать их с помощью вложенного цикла foreach

Вы также можете легко написать оболочку для существующей реализации карты, которая дает вам один итератор для всех значений, если вам это нужно, таким образом

0 голосов
/ 26 января 2012

Наличие Map с несколькими записями для одного и того же ключа непоправимо нарушает контракт Map.Если Multimap не работает для вас, то нет способа сделать это, не сломав много вещей.

В частности, если вы передадите свое чудовище чему-то, что указано для Map, этопочти наверняка сломается ... и похоже, что это то, что вы хотите с ним делать, так что да.

0 голосов
/ 26 января 2012

Я едва помню JSTL, но то, что вы говорите, звучит вроде противоречивых: В Еогеаспе:

1002 * здесь $ {а} должны указывать на какой-то контейнер значений, а затем мы итерация над ней * 1003.*

С другой стороны, вы говорите, что $ {abc} "должно вычислять первое значение c" (или ноль ...). Это неоднозначное определение.

Если вы чувствуете, что Multimapне то, что вам нужно, вы можете предоставить свою собственную реализацию коллекции (возможно, внутренне основанную на Multimap)

Так же, как идея, вы всегда можете рассматривать один элемент как список (который случайно состоит из одного элемента).Думаю, таким образом вы решите свою двусмысленность.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...