2013-07-14 18 views
2

我正在用Java編程我的模型,控制器等。@針對有序映射的keySet()迭代不遵守命令

我有一個數據模型,其中包含一個SortedMap<String, Foo>。地圖實施類是TreeMap

如果在模板中,我呈現地圖的值(使用其toString())是這樣的:

@theSortedMap.keySet() 

...那麼值在預期,上升順序打印出來。

但是,如果我用一個@for結構:

@for(keyValue <- theSortedMap.keySet()) { 
    @keyValue <br> 
} 

...然後迭代順序變得不可預測。

如何迭代地圖的關鍵點以保持所需的迭代順序?

(這是正常嗎?或者,這是比賽中的一個錯誤嗎?)

+1

你試過迭代entrySet嗎? – radai

+0

正如@radai建議的,嘗試使用entrySet(..)。如果不是,你不能使用傳統的java for-loop嗎? (我沒有Play的經驗) –

+0

@DhrubajyotiGogoi:關於播放模板的問題,所以,不。 :-) –

回答

1

它與Java集合被如何轉變爲通過隱式轉換Scala集合做。看起來,只有將地圖轉換爲普通的斯卡拉地圖,無論它們是否已排序。該規避的

一種方法是使用此結構來遍歷集合的迭代器:

@theSortedMap.keySet.iterator.map { key => <li>@key</li>} 
+0

你如何解釋這個事實:如果我使用@for((key,value)< - theSortedMap)遍歷'(key,value)''它迭代正確的_sorted_順序? –

+0

再次,明確調用迭代器應該工作得很好:'@for((key,value)< - theSortedMap.iterator){' – Daniel

+0

我不認爲你明白我的意思。您懷疑任何地圖轉換爲普通的scala地圖似乎與我看到的不一致 - 即「@for((k,v)< - map)'表示順序,而@for(k < - map.keySet())'不。如果它如你所說,我不希望_either_版本兌現訂單。 –

5

有同樣的問題。像這樣解決了這個問題

@for((key, value) <- map) { 
    <span>@key</span><span>@value</span> 
}