2013-04-30 75 views
4

我通過我的模板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

回答

12

這與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

2

對於任何Set類都沒有保證排序,因此最好在迭代之前對它進行排序。

如果你的意思是按字母順序打印出來,你應該把它轉換成一個列表,然後遍歷

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