【问题标题】:How to group rows with duplicate column properties in a JSTL c:forEach如何在 JSTL c:forEach 中对具有重复列属性的行进行分组
【发布时间】:2010-12-23 10:34:42
【问题描述】:

我正在使用 Java 进行编程,并且我有一个对象列表,我想在 JSTL 中进行迭代,以检查其他元素是否与当前元素有相似之处。而且我想在我的 jsp 中这样做,因为这只是一个显示问题。

让我们举一个虚拟的例子,假设我的对象具有三个属性:id、lastname 和 firstname。 id 将是一个家庭的标识符,我想在 HTML 表格中显示列表但是在迭代我的列表时我想检查列表的其余部分以查看是否存在其他家庭成员,以便我可以将它们重新组合到一个 td 标签中.

1 |多多 |詹姆士 2 |敌人 |卡梅伦 2 |敌人 |杰西卡 1 |多多 |拍 3 |样品 |鲍勃

预期结果:

<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 循环,因为我的列表是按 id 排序的,所以我可以轻松地检查下一个元素。但其他解决方案对我来说没问题。

【问题讨论】:

  • 您的示例中的列表在我看来并不有序。
  • 你是对的例子,但我的真实清单可以按 id 排序。我以这种方式编写了示例,以防您找到不需要有序列表的解决方案;)
  • 您的标题没有描述实际问题,这是分组,而不是循环。

标签: java jsp foreach jstl


【解决方案1】:

您可以在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>

然而,我同意这应该在(数据)模型端完成,而不是在视图端。

【讨论】:

    【解决方案2】:

    您的 bean 应该进行分组,而不是 JSP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多