地图也可以是收藏品吗?

时间:2012-01-26 04:42:38

标签: java collections jstl

我想要一张也是收藏品的地图。或者更具体地说,我希望能够迭代Map中的条目,包括特定键有多个条目的情况。

我正在尝试解决的具体问题是提供一个可以在jstl中使用的对象,以便使用c:forEach${a.b.c}这样的表达式进行迭代。在这个例子中,我希望${a.b.c}计算c的第一个值(如果没有,则为null),但也能够迭代所有c <c:forEach items="${a.b.c}">并让循环体依次查看c的每个单独值,尽管它们在地图中具有相同的键。

从方法的角度来看,这应该是直截了当的,只需提供一个Map实现,其entrySet()方法返回一个具有相同键的多个Entries的集合。但由于这似乎违反了地图的合同,事情会以微妙但灾难性的方式破裂吗?还有其他人做过这种事吗?

(如果你猜我试图呈现xml,你就是对的)

修改

请注意,这是在jstl中使用,因此我提供的任何界面都必须满足2个条件:

  • [].运算符一起使用时,它必须是MapList,数组或JavaBeans对象(以及它们不能是列表或数组,因为索引不是数字)
  • 与forEach一起使用时,它必须是数组,CollectionIteratorEnumerationMapString

所以我想真正的问题是,我是否可以依靠jstl 调用.containsKey().get().entrySet()而不关心违反不变量的情况,而不是在内部制作一个不会保留特殊迭代行为的Map副本。

4 个答案:

答案 0 :(得分:5)

您要找的是MultimapGuava提供了它的实现,特别是您正在寻找ArrayListMultimap

答案 1 :(得分:0)

我几乎不记得jstl,但你说的话听起来有点争议: 在foreach:

这里$ {a.b.c}应指向一些容器的值,然后我们迭代它。

另一方面,你说,$ {a.b.c}“应该评估为c的第一个值”(或null ...) 这是一个含糊不清的定义。

如果您觉得Multimap不是您想要的,您可以提供自己的集合实现(可能内部基于Multimap)

就像一个想法一样,你总是可以将一个元素看作一个列表(这是偶然的 由一个元素组成)。这样你就可以解决你的歧义了。

我希望这会有所帮助

答案 2 :(得分:0)

Map具有同一个密钥的多个条目会无法修复Map合同。如果Multimap对您不起作用,那么在不破坏很多事情的情况下就无法做到这一点。

具体来说,如果你将怪物传递给指定采用Map的东西,它几乎肯定会破坏......听起来就像你想用它做的那样,所以是的。

答案 3 :(得分:0)

如何使用带集合的地图作为值?那么你可以为同一个键设置不同的值,你可以通过嵌套的foreach-loop

迭代它们

你也可以轻松地为现有的地图实现编写一个包装器,如果你需要那样,它就可以为所有值提供一个迭代器