26

使用 JSTL 的forEach标签,是否可以以相反的顺序进行迭代?

4

5 回答 5

34

当您forEach用于创建整数循环时,您可以前进或后退,但这需要一些工作。事实证明你不能这样做,例如:

<c:forEach var="i" begin="10" end="0" step="-1">
    ....
</c:forEach>

因为规范要求步骤是积极的。但是您始终可以按正序循环,然后使用<c:var将递增的数字转换为递减的数字:

<c:forEach var="i" begin="0" end="10" step="1">
   <c:var var="decr" value="${10-i}"/>
    ....
</c:forEach>

但是,当您forEach对任何类型的 Collection 进行操作时,我不知道有任何方法可以使对象以相反的顺序排列。至少,必须先将元素排序为相反的顺序,然后使用forEach.

forEach通过在 JSP 中执行以下操作,我已成功按所需顺序导航循环:

<%
List list = (List)session.getAttribute("list");
Comparator comp = ....
Collections.sort(list, comp);
%>


<c:forEach var="bean" items="<%=list%>">
     ...
</c:forEach>

使用合适的比较器,您可以按任何所需的顺序遍历项目。这行得通。但是我不知道有一种方法可以非常简单地以相反的顺序迭代提供的集合。

于 2009-04-02T23:44:50.517 回答
7

基于Eddie给出的答案,我使用以下代码以相反的顺序遍历集合。

给定一个名为“list”的集合,其中存储了人员列表。

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

<%-- Keep a reference to the size of the collection --%>
<c:set var="num_people" value="${fn:length(list)}" />

<%-- Iterate through items. Start at 1 to avoid array index out of bounds --%>
<c:forEach var="i" begin="1" end="${num_people}" step="1">
    <c:set var="person" value="${list[num_people-i]}" />

    ${person.name}<br />
</c:forEach>
于 2015-04-23T09:31:03.113 回答
4

您还可以考虑滚动一个自定义 JSTL 函数,该函数返回列表的反向副本,由以下内容支持:

public static <T extends Object> List<T> reverse(List<T> list) {
    List<T> copy = Collections.emptyList();
    Collections.copy(copy, list);
    Collections.reverse(copy);
    return copy;
}

不适用于集合,但正如另一个答案中提到的,排序的概念对于某些集合来说有点模糊。

于 2009-04-03T02:22:48.203 回答
1

我们可以用一点技巧来做到这一点:-

<c:forEach begin="1" end="10" var="i" step="1">
     <c:set var="j" value="${10-i+1}" scope="page"></c:set>
     <c:out value="${j}"/>
</c:forEach>

输出将是:- 10 9 8 7 6 5 4 3 2 1

于 2011-09-23T15:30:43.083 回答
0

您可以在将 Collection添加到模型之前对其进行反转。

这也意味着您无需在视图层中执行任何操作即可满足您的要求。

于 2015-03-09T20:03:24.333 回答