我想要一张也是收藏品的地图。或者更具体地说,我希望能够迭代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个条件:
[]
和.
运算符一起使用时,它必须是Map
,List
,数组或JavaBeans对象(以及它们不能是列表或数组,因为索引不是数字)Collection
,Iterator
,Enumeration
,Map
或String
。所以我想真正的问题是,我是否可以依靠jstl 仅调用.containsKey()
,.get()
和.entrySet()
而不关心违反不变量的情况,而不是在内部制作一个不会保留特殊迭代行为的Map副本。
答案 0 :(得分:5)
您要找的是Multimap。 Guava提供了它的实现,特别是您正在寻找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
迭代它们你也可以轻松地为现有的地图实现编写一个包装器,如果你需要那样,它就可以为所有值提供一个迭代器