如何使用JSTL迭代HashMap中的ArrayList?

Rak*_*yal 35 java jsp jstl arraylist map

我有这样的地图,

Map<Integer,ArrayList<Object>> myMap = new LinkedHashMap<Integer,ArrayList<Object>>();
Run Code Online (Sandbox Code Playgroud)

现在我必须迭代这个Map,然后迭代地图中的ArrayList.我怎么能用JSTL做到这一点?

Bal*_*usC 74

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

在地图的情况下,每次迭代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>
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,${entry.value}实际上是a 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>
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 我喜欢你用'$ {!loop.last?',':''}':D (6认同)
  • 你可以在这里找到更多方法:http://java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html` $ {loop.index} `,`$ {loop.first}`和`$ {loop.last}`在这里最有用. (3认同)

dcp*_*dcp 6

你尝试过这样的事吗?

<c:forEach var='item' items='${map}'>
    <c:forEach var='arrayItem' items='${item.value}' />
      ...
    </c:forEach>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)


小智 5

你还没有关闭c tag.try out

 <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>
Run Code Online (Sandbox Code Playgroud)