Как перебрать ArrayList внутри HashMap с помощью JSTL? - PullRequest
35 голосов
/ 22 января 2010

У меня есть такая карта,

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

Теперь я должен перебрать эту карту, а затем ArrayList внутри карты.Как я могу сделать это с помощью JSTL?

Ответы [ 4 ]

73 голосов
/ 22 января 2010

Вы можете использовать тег JSTL <c:forEach> для перебора массивов, коллекций и карт.

В случае массивов и коллекций, каждая итерация var сразу выдаст вам только итерированный в данный момент элемент.

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

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

В случае карт каждая итерация var даст вам объект Map.Entry, который, в свою очередь, имеет методы getKey() и 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>

В вашем конкретном случае ${entry.value} - это на самом деле List, поэтому вам необходимо выполнить итерации по нему:

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

varStatus есть только для удобства;)

Чтобы лучше понять, что здесь происходит, вот простой перевод на 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();
}

Смотри также:

6 голосов
/ 22 января 2010

Вы пробовали что-то подобное?

<c:forEach var='item' items='${map}'>
    <c:forEach var='arrayItem' items='${item.value}' />
      ...
    </c:forEach>
</c:forEach>
5 голосов
/ 22 октября 2012

вы не закрыли c tag.пробовать это

 <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>
0 голосов
/ 07 февраля 2015

Вы также можете зацикливаться только на карте. Оцените ее значение, если вы знаете ключ

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