How to iterate an ArrayList inside a HashMap using

2019-01-01 09:22发布

问题:

I have a map like this,

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

Now I have to iterate this Map and then the ArrayList inside the map. How can I do this using JSTL?

回答1:

You can use JSTL <c:forEach> tag to iterate over arrays, collections and maps.

In case of arrays and collections, every iteration the var will give you just the currently iterated item right away.

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

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

In case of maps, every iteration the var will give you a Map.Entry object which in turn has getKey() and getValue() methods.

<%@ 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>

In your particular case, the ${entry.value} is actually a List, thus you need to iterate over it as well:

<%@ 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>

The varStatus is there just for convenience ;)

To understand better what\'s all going on here, here\'s a plain Java translation:

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();
}

See also:

  • How to loop through a HashMap in JSP?
  • Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern
  • How to loop over something a specified number of times in JSTL?


回答2:

Did you try something like this?

<c:forEach var=\'item\' items=\'${map}\'>
    <c:forEach var=\'arrayItem\' items=\'${item.value}\' />
      ...
    </c:forEach>
</c:forEach>


回答3:

you haven\'t closed c tag.try out this

 <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>


回答4:

You can also loop round just the map.value its self if you know the key

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