按顺序迭代设置Play框架

问题描述:

我通过我的模板TreeSetStrings。但是,当我循环这样设置时:按顺序迭代设置Play框架

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

但是,名称从不以正确的顺序打印。

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

+0

什么是“正确”的顺序?如果您希望“按字母排序”以外的任何内容,那么您应该重新考虑您为“用户名”选择的数据结构。 – Dylan 2013-04-30 19:57:20

+0

@Dylan,我的意思是按字母顺序打印,问题是目前似乎没有排序。有一次,它按顺序打印它们,下一次刷新页面时,它会以不同的顺序显示它们等等。 – Aerus 2013-05-01 08:24:17

+1

几个月前,我在Play问题跟踪器中为此问题打开了一个错误。 https://github.com/playframework/playframework/issues/1091 – 2013-07-25 21:51:04

这与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 , 
}