【问题标题】:How to iterate an ArrayList inside a HashMap using JSTL?如何使用 JSTL 在 HashMap 中迭代 ArrayList?
【发布时间】:2011-01-08 05:19:09
【问题描述】:

我有一张这样的地图,

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

现在我必须迭代这个 Map,然后是 Map 中的 ArrayList。如何使用 JSTL 做到这一点?

【问题讨论】:

    标签: java jsp map arraylist jstl


    【解决方案1】:

    您可以使用JSTL &lt;c:forEach&gt; 标签来迭代数组、集合和映射。

    对于数组和集合,每次迭代 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();
    }
    

    另见:

    【讨论】:

    • 我喜欢你使用 '${!loop.last 的方式? ', ' : ''}' :D
    • 您可以在这里找到更多方法:java.sun.com/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/… ${loop.index}、${loop.first} 和 ${loop.last} 在这里最有用。
    • 耶!感谢这篇文章。这完全符合我使用 map.value 作为列表的情况:)
    • 应该被 终止
    • 猫王离开了大楼?:
    【解决方案2】:

    如果你知道密钥,你也可以只循环 map.value 的自身

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

    【讨论】:

      【解决方案3】:

      你还没有关闭c标签。试试这个

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

      【讨论】:

        【解决方案4】:

        你尝试过这样的事情吗?

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

        【讨论】:

        • 当然,您可能希望在两个 foreach 语句之间输出 ${item.key}。
        猜你喜欢
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 2012-09-01
        • 2016-02-03
        • 2012-03-04
        • 2011-12-02
        相关资源
        最近更新 更多