我通過我的模板TreeSet
與Strings
。但是,當我循環這樣設置時:按順序迭代設置Play框架
@(usernames : TreeSet[String])
@for(name <- usernames){
@name ,
}
但是,名稱從不以正確的順序打印。
如何迭代我的模板中的設置並按順序打印名稱?
我通過我的模板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 ,
}
我將'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