按顺序迭代设置Play框架
问题描述:
我通过我的模板TreeSet
与Strings
。但是,当我循环这样设置时:按顺序迭代设置Play框架
@(usernames : TreeSet[String])
@for(name <- usernames){
@name ,
}
但是,名称从不以正确的顺序打印。
如何迭代我的模板中的设置并按顺序打印名称?
答
这与Scala模板的工作方式有关。我怀疑你的TreeSet集合被映射到不同的集合,结果排序不被保留。
Scala模板中的Scala for循环和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 ,
}
+0
我将'TreeSet'转换为一个序列,它的功能就像一个魅力,谢谢! – Aerus 2013-05-01 13:24:22
答
对于任何Set类都没有保证排序,因此最好在迭代之前对它进行排序。
如果你的意思是按字母顺序打印出来,你应该把它转换成一个列表,然后遍历
@(usernames : TreeSet[String])
@for(name <- usernames.toList().sortWith(_ < _)){
@name ,
}
什么是“正确”的顺序?如果您希望“按字母排序”以外的任何内容,那么您应该重新考虑您为“用户名”选择的数据结构。 – Dylan 2013-04-30 19:57:20
@Dylan,我的意思是按字母顺序打印,问题是目前似乎没有排序。有一次,它按顺序打印它们,下一次刷新页面时,它会以不同的顺序显示它们等等。 – Aerus 2013-05-01 08:24:17
几个月前,我在Play问题跟踪器中为此问题打开了一个错误。 https://github.com/playframework/playframework/issues/1091 – 2013-07-25 21:51:04