抑制已经遇到的列表元素

时间:2015-05-22 02:13:32

标签: velocity

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

它目前有一个看起来像

的块
#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

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

1 个答案:

答案 0 :(得分:1)

这种逻辑(重复数据删除)可能是您的视图(Velocity)层中要避免的。在Model-View-Controller之后,最好让这个逻辑由控制器类管理,让Velocity模板简单地渲染它传递的数据结构。

例如,通过使用诸如java.util.Set之类的数据结构,不会允许重复项,因此模板不需要重复数据删除。

就我个人而言,我发现Rob Harrop Pro Jakarta Velocity是一个非常好的MVC指南,尤其是第4章&#34;在MVC环境中使用Velocity&#34;。

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

通常,在视图层中实现的逻辑越少越好。它还可以使您的代码更容易测试,因此您可以验证其行为,而无需启动演示组件,应用服务器等等。

如果确实没有选择并且绝对必须在模板中写入逻辑,那么以下实现了所提供的伪代码:

#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.List add()方法(布尔值)的输出。另一个不在模板代码中写这个的原因!

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

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