35 votes

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 et ensuite la liste de tableaux à l'intérieur de la carte. Comment puis-je faire cela en utilisant JSTL ?

74voto

BalusC Points 498232

Vous pouvez utiliser JSTL <c:forEach> pour itérer sur des tableaux, des collections et des cartes.

Dans le cas des tableaux et des collections, à chaque itération, la fonction var vous donnera juste l'élément actuellement itéré immédiatement.

<%@ 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 des cartes, à chaque itération, le var vous donnera un Map.Entry qui, à son tour, a getKey() y getValue() méthodes.

<%@ 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 un List Il faut donc aussi itérer sur elle :

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

Le site varStatus est là juste pour la commodité ;)

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

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

6voto

dcp Points 26928

Avez-vous essayé quelque chose comme ça ?

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

5voto

greeshma john Points 21

Vous n'avez pas fermé la balise c. Essayez ceci

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

0voto

gordon m Points 11

Vous pouvez également faire une boucle autour de la valeur de la carte si vous connaissez la clé.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X