it-swarm.com.de

Wie iteriere ich eine ArrayList in einer HashMap mit JSTL?

Ich habe eine Karte wie diese,

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

Jetzt muss ich diese Map und dann die ArrayList innerhalb der Map durchlaufen. Wie kann ich dies mit JSTL tun?

35
Rakesh Juyal

Sie können das Tag JSTL<c:forEach> verwenden, um Arrays, Sammlungen und Karten zu durchlaufen.

Bei Arrays und Auflistungen gibt Ihnen das var bei jeder Iteration sofort nur das aktuell iterierte Element.

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

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

Im Fall von Maps gibt Ihnen die var bei jeder Iteration ein Map.Entry -Objekt mit den Methoden getKey() und 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>
_

In Ihrem speziellen Fall ist der _${entry.value}_ tatsächlich ein List, daher müssen Sie auch darüber iterieren:

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

Die varStatus ist nur zur Vereinfachung da;)

Um besser zu verstehen, was hier alles vor sich geht, ist hier eine einfache Java Übersetzung:

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

Siehe auch:

74
BalusC

Hast du so etwas probiert?

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

sie haben c Tag nicht geschlossen

 <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

Sie können auch nur die Karte in einer Schleife ablaufen lassen, wenn Sie den Schlüssel kennen

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