【问题标题】:suppress list elements that have already been encountered抑制已经遇到的列表元素
【发布时间】:2015-08-03 22:08:45
【问题描述】:

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

它目前有一个看起来像这样的块

#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


    【解决方案1】:

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

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

    我个人发现 Rob Harrop 的 Pro Jakarta Velocity 是一个非常好的 MVC 指南,尤其是第 4 章“在 MVC 环境中使用 Velocity”。

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

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

    如果实在是没办法,必须把逻辑写在模板里,那么下面就实现给出的伪代码:

    #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 方法的劣质解决方案,但作为最后的选择。

    【讨论】:

    • 我完全同意。然而,有时事情是强加于我们的。
    • @BevynQ 您对我的回答是否满意以接受它,或者您觉得它仍然缺少什么?谢谢!
    • 谢谢你的代码看起来和我最终做的差不多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多