Как сгруппировать строки с повторяющимися свойствами столбца в JSTL c: forEach

Я программирую на Java, и у меня есть список объектов, которые я хотел бы повторить в JSTL, чтобы проверить, имеют ли другие элементы некоторое сходство с текущим. И я хотел бы сделать это в своем JSP, потому что это просто вопрос отображения.

Давайте возьмем фиктивный пример и скажем, что мой объект имеет три свойства: id, lastname и firstname. id будет идентификатором семьи, и я хочу отобразить список в таблице HTML, НО при повторении моего списка я хочу проверить остальную часть списка, чтобы увидеть, присутствуют ли другие члены семьи, чтобы я мог перегруппировать их в один тег td .

1 | TOTO   | James 
2 | FOE    | Cameron 
2 | FOE    | Jessica 
1 | TOTO   | Pat
3 | SAMPLE | Bob

Ожидаемый результат :

<table>
   <tr><td>1</td><td>TOTO</td><td>James, Pat</td></tr>
   <tr><td>2</td><td>FOE</td><td>Cameron, jessica</td></tr>
   <tr><td>3</td><td>SAMPLE</td><td>Bob</td></tr>
</table>

Опять же, это базовый пример, и у вас может возникнуть соблазн сказать мне перегруппировать мои семьи в другом объекте в моем слое модели, но я бы не стал этого делать.


Редактировать: я подразумеваю цикл while, потому что мой список упорядочен по идентификатору, поэтому я могу легко проверить следующие элементы. Но другие решения были бы хороши для меня.


person Anth0    schedule 23.12.2010    source источник
comment
список в вашем примере не выглядит упорядоченным для меня.   -  person dogbane    schedule 23.12.2010
comment
Вы правы для примера, но мой реальный список можно упорядочить по идентификатору. Я написал пример таким образом, если вы найдете решение, которое не требует упорядоченного списка;)   -  person Anth0    schedule 23.12.2010
comment
Ваш заголовок не описывает реальную проблему, а именно группировку, а не зацикливание.   -  person user207421    schedule 23.12.2010


Ответы (2)


Вы можете получить обработанные фамилии в Map и перехватить их.

<table>
    <jsp:useBean id="processed" class="java.util.HashMap" />
    <c:forEach items="${persons}" var="person">
        <c:if test="${empty processed[person.lastName]}">
            <c:set target="${processed}" property="${person.lastName}" value="true" />
            <tr>
                <td>${person.familyId}</td>
                <td>${person.lastName}</td>
                <td>${person.firstName}
                    <c:forEach items="${persons}" var="other">
                        <c:if test="${person.lastName == other.lastName and person.firstName != other.firstName}">
                            , ${other.firstName}
                        </c:if>
                    </c:forEach>
                </td>
            </tr>
        </c:if>
    </c:forEach>
</table>

Однако я согласен с тем, что это следует делать на стороне модели (данных), а не на стороне представления.

person BalusC    schedule 23.12.2010

Ваш компонент должен выполнять группировку, а не JSP.

person user207421    schedule 23.12.2010