Comment itérer un ArrayList à l'intérieur d'une 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 puis L'ArrayList à l'intérieur de la carte. Comment puis-je faire cela en utilisant JSTL?

35
demandé sur informatik01 2010-01-22 16:45:52

4 réponses

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

dans le cas de tableaux et de collections, chaque itération du var vous donnera juste l'item itéré en cours 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 de cartes, chaque itération le var vous donnera un Map.Entry objet qui à son tour a 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 un List , donc vous devez itérer sur elle aussi bien:

<%@ 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 varStatus est là juste pour des raisons de 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 aussi:

71
répondu BalusC 2017-05-23 12:03:01

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
répondu dcp 2010-01-22 13:50:37

vous n'avez pas fermé l'étiquette C.essayez ce

 <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
répondu greeshma john 2012-10-22 07:16:14

vous pouvez également boucle autour de la carte.valeur son soi si vous connaissez la clé

<c:forEach var="value" items="${myMap[myObject.someInteger]}">
    ${value}
</c:forEach>
0
répondu gordon m 2015-02-07 16:45:19