我有一個Map(資料型別),其資料結構如下:
我有一個Map(資料型別)。
var timePassedCamerasetB = mutable.Map.empty[String, Time] 。
它包含一個字串和一個'時間'物件。這個'時間'物件是由我自己的類組成的。下面你可以看到它是由什么組成的:
case class Time( daysSinceEpoch: Int, hours: Int, minutes: Int, seconds: Double)
我已經將我的所有資料保存在這個'Map'變數中。但是有一個問題:我想根據多種情況對這個'Map'變數中的值進行排序,但是我找不到任何方法來使其生效。
例如。
例如。我在這個地圖中存盤了以下資料:
PP-33-XX -> Time(18492,3,7,0。 0)
BA-12-PW -> 時間(18492,9,0, 40. 0)
MM-11-OW -> 時間(18492,3,7,16。 0)
NX-66-PP -> 時間(18492,3,6,30。 0)
洛杉磯-53-NY -> 時間(18492,9,0, 56. 0)
我想按順序對這些值進行排序(最早的時間到最晚的時間)。這包括比較多個因素。首先比較每個daySinceEpoch,然后是小時、分鐘和秒。
我想把地圖轉化為下面的內容:
NX-66-PP -> 時間(18492,3,6,30。 0)
PP-33-XX -> 時間(18492,3,7, 0。 0)
MM-11-OW -> 時間(18492,3,7,16。 0)
BA-12-PW -> 時間(18492,9,0, 40。 0)
洛杉磯-53-NY -> 時間(18492,9,0, 56. 0)
有人知道有什么有效的方法可以做到這一點嗎?不幸的是我不能。
uj5u.com熱心網友回復:
正如Luis所評論的,Maps,特別是mutable.Map并不是被設計用來保存有序的值。如果你可以使用一個List,它可以很容易地被排序,就像這樣:
timePassedCamerasetB
.toList
.sortBy {
case (_, time) => (time.daySinceEpoch, time. 小時, 時間.分鐘, 時間.秒)
}
這個運算式必須被分配給新的值
uj5u.com熱心網友回復:聽起來像一個ListMap是你想要的東西。
來自ScalaDocs頁面。"條目在內部以相反的插入順序存盤,這意味著最新的鍵位于串列的頭部。"
因此,從ScalaDocs 頁面中可以看到:"條目在內部以相反的插入順序存盤。
所以要從當前的Map轉到ListMap:
import scala.collection.immutable.ListMap.
val newMap: ListMap[String,Time] =
oldMap.toList.sortBy{
case (_, Time(d,h,m,s)) =>(d,h,m,s
}.foldLeft(ListMap[String,Time]() (_ _)
測驗:
newMap。 head //res0: (NX-66-PP,Time(18492, 3,6, 30. 0)
newMap. last //res1: (LA-53-NY,Time(18492, 9,0, 56. 0)
newMap("MM-11-OW") //res2。時間(18492,3,7,16. 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/309106.html
標籤:
