抑制已经遇到的列表元素

suppress list elements that have already been encountered

您好,我有一个速度模板正在尝试编辑

它目前有一个看起来像

的块
#foreach( $element in $myList )
  $element.field1 ($element.field2) issued by $element.field ($element.field4 )
<br><br>
#end

问题是列表中的某些元素重复,我需要取消重复。

我想要的伪代码是

for each element in list
    if element is not in displayed
        display element
        add element to displayed
    endif
endfor

有人能指出我正确的方向吗?

这种逻辑(去重)可能是你的视图(Velocity)层要避免的事情。在 Model-View-Controller 之后,最好由控制器 类 管理此逻辑,让 Velocity 模板简单地呈现传递给它的数据结构。

例如,通过使用像java.util.Set这样的数据结构,将不允许重复,因此模板不需要去重。

我个人认为 Rob Harrop 的 Pro Jakarta Velocity 是一本非常好的 MVC 指南,尤其是第 4 章 "Using Velocity in an MVC environment"。

让模型使用一个集合,让您的控制器代码填充集合,然后您的模板代码中的简单循环就可以像现在这样使用了。

一般来说,在视图层实现的逻辑越少越好。它还将使您的代码更易于测试,因此您无需启动演示组件、应用程序服务器等即可验证其行为。

如果真的没办法,逻辑一定要写在模板里,那么下面实现伪代码:

#set($displayed = [])
#foreach( $element in $myList )
  #if(!$displayed.contains($element))
    $element.field1 ($element.field2) issued by $element.field ($element.field4 )
    <br><br>
    #set($ignore = $displayed.add($element))
  #end
#end

请注意 #set($ignore = $displayed.add($element)) 的混乱 - 必须这样做才能抑制 java.util.Listadd() 方法(布尔值)的输出被输出。另一个不在模板代码中编写的原因!

当然,您还需要确保 equals() 在添加到列表的类型上正确实现,以便列表操作 - contains()add() 正常工作.

绝对是上述 MVC 方法的次等解决方案,但作为最后的选择提供。