如何使用JSTL遍历HashMap中的ArrayList?

35

我有一个类似于这样的地图:

Map<Integer,ArrayList<Object>> myMap = new LinkedHashMap<Integer,ArrayList<Object>>();

现在我需要迭代这个Map,然后迭代Map内部的ArrayList。如何使用JSTL实现此操作?

4个回答

77
你可以使用JSTL <c:forEach>标签来循环遍历数组、集合和映射。
在数组和集合的情况下,每次迭代中,var 将立即给出当前迭代的项。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${collectionOrArray}" var="item">
    Item = ${item}<br>
</c:forEach>

在处理地图时,每次迭代中var都会给你一个Map.Entry对象,该对象具有getKey()getValue()方法。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${map}" var="entry">
    Key = ${entry.key}, value = ${entry.value}<br>
</c:forEach>

在您的情况下,${entry.value}实际上是一个List,因此您还需要对其进行迭代:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${map}" var="entry">
    Key = ${entry.key}, values = 
    <c:forEach items="${entry.value}" var="item" varStatus="loop">
        ${item} ${!loop.last ? ', ' : ''}
    </c:forEach><br>
</c:forEach>

变量 varStatus 只是为了方便而存在;)

为了更好地理解这里正在发生的事情,这是一个简单的 Java 翻译:

for (Entry<String, List<Object>> entry : map.entrySet()) {
    out.print("Key = " + entry.getKey() + ", values = ");
    for (Iterator<Object> iter = entry.getValue().iterator(); iter.hasNext();) {
        Object item = iter.next();
        out.print(item + (iter.hasNext() ? ", " : ""));
    }
    out.println();
}

参见:


6
我喜欢你使用了“${!loop.last ? ', ' : ''}”这种方式 :D - Rakesh Juyal
3
您可以在这里找到更多的方法:http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html ${loop.index}${loop.first}${loop.last}在这里是最有用的。 - BalusC
太棒了!感谢这篇文章。它完全符合我的情况,我使用 map.value 作为列表 :) - Dzung Nguyen
<c:forEach> 应该以 </c:forEach> 结束。 - MrRaymondLee
Elvis已经离开大厦了吗? - Edward J Beckett
@BalusC 我也有一个类似的问题在这里关于JSTL的东西。看看你能否帮我解决一下..任何帮助都将不胜感激。 - user2467545

6
你是否尝试过以下方法?
<c:forEach var='item' items='${map}'>
    <c:forEach var='arrayItem' items='${item.value}' />
      ...
    </c:forEach>
</c:forEach>

当然,在两个foreach语句之间,您可能想要输出${item.key} - Powerlord

5
您没有关闭c标签。尝试使用以下代码进行修复:

 <c:forEach items="${logMap}" var="entry">
        Key = ${entry.key}, values = 
        <c:forEach items="${entry.value}" var="item" varStatus="loop">
            ${item} ${!loop.last ? ', ' : ''}
        </c:forEach><br>
    </c:forEach>

0

如果您知道键,也可以仅循环遍历map.value本身

<c:forEach var="value" items="${myMap[myObject.someInteger]}">
    ${value}
</c:forEach>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接