web-dev-qa-db-ja.com

JSTL forEachの逆順

JSTLのforEachタグを使用すると、逆の順序で繰り返すことができますか?

25
Steve Kuo

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を実行している場合、オブジェクトを逆の順序にする方法はわかりません。少なくとも、最初に要素を逆順でソートし、forEachを使用してthenを使用する必要があります。

JSPで次のようなことを実行して、forEachループを目的の順序で正常にナビゲートしました。

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


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

適切なコンパレータを使用すると、アイテムを任意の順序でループできます。これは機能します。しかし、私は、非常に簡単に言うと、提供されたコレクションを逆の順序で反復する方法を知りません。

34
Eddie

次のようなものに裏付けられた、リストの逆のコピーを返すカスタム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;
}

コレクションでは機能しませんが、別の回答で述べたように、一部のコレクションでは順序付けの概念が少しあいまいです。

3
harto

Eddie によって与えられた答えに基づいて、次のコードを使用してコレクションを逆順で反復しました。

人のリストを格納する「リスト」と呼ばれるコレクションがあるとします。

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

モデルに追加する前に コレクションを元に戻す を行うことができます。

これは、要件を達成するためにビューレイヤーで何もする必要がないことも意味します。

0
yglodt

これは少しトリックで行うことができます:-

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

OutPutは次のようになります:-10 9 8 7 6 5 4 3 2 1

0
Sunil Mahla