web-dev-qa-db-fra.com

Comment itérer une ArrayList dans un HashMap en utilisant JSTL?

J'ai une carte comme celle-ci,

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

Maintenant, je dois itérer cette carte puis la liste de tableaux à l'intérieur de la carte. Comment puis-je faire cela en utilisant JSTL?

35
Rakesh Juyal

Vous pouvez utiliser JSTL<c:forEach> tag pour parcourir les tableaux, les collections et les cartes. 

Dans le cas de tableaux et de collections, chaque itération de la var vous donnera immédiatement l'élément itéré.

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

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

Dans le cas de cartes, chaque itération de la var vous donnera un objet Map.Entry qui possède à son tour les méthodes getKey() et 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>

Dans votre cas particulier, le ${entry.value} est en fait une List; vous devez donc l'itérer également:

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

La varStatus n’est là que par commodité;)

Pour mieux comprendre ce qui se passe ici, voici une traduction Java simple:

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

Voir également:

71
BalusC

Avez-vous essayé quelque chose comme ça?

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

vous n'avez pas fermé 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>
5
greeshma john

Vous pouvez également faire une boucle autour de la carte.

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