迭代按顺序播放Play框架

时间:2013-04-30 19:51:20

标签: scala templates playframework-2.0

我将模板TreeSet传递给Strings。但是,当我循环遍历这样的集合时:

@(usernames : TreeSet[String])
@for( name <- usernames){
    @name ,
}

但是,名称永远不会以正确的顺序打印。

如何在模板中迭代我的设置并按顺序打印名称?

2 个答案:

答案 0 :(得分:14)

这与Scala模板的工作方式有关。我怀疑你的TreeSet集合在引擎盖下映射到不同的集合,因此不保留排序。

Scala for循环的行为和Scala模板中的for循环之间明显不同。如果您将代码作为常规Scala代码运行,那么TreeSet的顺序显然会被保留:

val users = TreeSet("foo", "bar", "zzz", "abc")    
for (user <- users) {
  println(user)
}

解决问题的方法之一是在Scala模板中使用迭代器:

@for(name <- usernames.iterator) {
  @name ,
}

或将TreeSet转换为序列:

@for(name <- usernames.toSeq) {
  @name ,
}

答案 1 :(得分:2)

任何Set类都没有保证排序,因此最好在迭代之前对其进行排序。

如果您打算按字母顺序打印,则应将其转换为List,然后迭代

@(usernames : TreeSet[String])
@for( name <- usernames.toList().sortWith(_ < _)){
    @name ,
}