¿Cómo iterar un ArrayList dentro de un HashMap usando JSTL?

Resuelto Rakesh Juyal asked hace 14 años • 4 respuestas

Tengo un mapa como este

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

Ahora tengo que iterar este Mapa y luego el ArrayList dentro del mapa. ¿Cómo puedo hacer esto usando JSTL?

Rakesh Juyal avatar Jan 22 '10 20:01 Rakesh Juyal
Aceptado

Puede utilizar la etiqueta JSTL <c:forEach> para iterar sobre matrices, colecciones y mapas.

En el caso de matrices y colecciones, cada iteración varle proporcionará de inmediato solo el elemento iterado actualmente.

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

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

En el caso de los mapas, cada iteración varle dará un Map.Entryobjeto que a su vez tiene getKey()métodos 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>

En su caso particular, en ${entry.value}realidad es un List, por lo que también debe iterarlo:

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

Está varStatusahí sólo por conveniencia;)

Para comprender mejor lo que está sucediendo aquí, aquí hay una traducción simple de 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();
}

Ver también:

  • ¿Cómo recorrer un HashMap en JSP?
  • Muestre JDBC ResultSet en HTML en la página JSP usando el patrón MVC y DAO
  • ¿Cómo recorrer algo un número específico de veces en JSTL?
BalusC avatar Jan 22 '2010 14:01 BalusC

¿Intentaste algo como esto?

<c:forEach var='item' items='${map}'>
    <c:forEach var='arrayItem' items='${item.value}' />
      ...
    </c:forEach>
</c:forEach>
dcp avatar Jan 22 '2010 13:01 dcp

No has cerrado la etiqueta c. Prueba esto.

 <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>
greeshma john avatar Oct 22 '2012 06:10 greeshma john