Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSTL forEach反向顺序_Java_Jsp_Jstl - Fatal编程技术网

Java JSTL forEach反向顺序

Java JSTL forEach反向顺序,java,jsp,jstl,Java,Jsp,Jstl,使用JSTL的forEach标记,是否可以按相反的顺序进行迭代?当您使用forEach创建整数循环时,您可以前进或后退,但这需要一些工作。事实证明,您不能这样做,例如: <c:forEach var="i" begin="10" end="0" step="-1"> .... </c:forEach> 使用合适的比较器,您可以按任何所需顺序循环项目。这很有效。但是,我不知道一个简单的方式,以相反的顺序重复所提供的集合。您也可以考虑滚动一个自定义的JSTL函数,它

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

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

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

使用合适的比较器,您可以按任何所需顺序循环项目。这很有效。但是,我不知道一个简单的方式,以相反的顺序重复所提供的集合。

您也可以考虑滚动一个自定义的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;
}
公共静态列表反向(列表){
List copy=Collections.emptyList();
收藏。副本(副本,列表);
收藏。反面(复印件);
返回副本;
}

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

我们可以通过一些技巧来实现这一点:-

<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

您可以在将其添加到您的模型之前


这也意味着您不需要在视图层中执行任何操作来实现您的需求。

基于所给出的答案,我使用以下代码以相反的顺序迭代集合

给定一个名为“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>

${person.name}

我更新了答案,添加了一个代码示例,说明我是如何按照所需的顺序对集合进行迭代的。或者更好的是,按照集合的使用顺序创建集合。JSP不是数据处理的好地方。哟,-1用来向某人展示如何做某事?我们只允许展示理想的方式?天哪。@Eddie-我没有否决你的答案,但当我尝试你的解决方案时,我得到了和这里提到的相同的问题:。所以这可能就是原因,因为你的解决方案似乎并不总是有效(对我来说不起作用)。最初的问题是关于一个集合的(见上面的评论),这是有效的。我纠正了错误的部分。谢谢你指出这一点。埃迪在这个问题上的公认答案可能并不适用于所有人。至少,使用雅加达(Apache)的JSTL 1.1实现和Sun(Oracle)的JSTL 1.2实现对我来说不起作用。规范还要求
步骤
必须
>=1
。另一种选择是,请参阅减量的良好解释,您所做的只是复制OP给出的链接中的内容。
<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>
<%@ 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>