我正在嘗試以實用的方式解決以下問題。鑒于我有一個如下所示的資料結構:
final case class ActionConfiguration(
configId: Int,
actions: List[Action],
`type`: String,
time: String,
weekday: Option[List[Int]]
)
我有一個具有以下簽名的地圖:Map[TargetLocation, List[ActionConfiguration]]
如您所見,我想在配置的時間和作業日在目標位置執行一些操作。它當前的作業方式是,如果我有一組要在同一時間和同一天執行的操作,我將僅在操作串列中填充一個操作并創建許多可能具有相同配置時間和日期的 ActionConfiguration 物件。我的目標是利用 Actions 串列來填充我想要在單個 ActionConfiguration 中執行的所有操作。
例如,鑒于我今天的情況:
"ActionConfiguration":[
{
"configId":1,
"actions":[
{
"cmd":"doAction1"
}
],
"type":"weekly",
"time":"09:00",
"weekday":[
5
]
},
{
"configId":2,
"actions":[
{
"cmd":"doAction2"
}
],
"type":"weekly",
"time":"09:00",
"weekday":[
5
]
},
{
"configId":3,
"actions":[
{
"cmd":"doAction3"
}
],
"type":"weekly",
"time":"09:00",
"weekday":[
5
]
},
{
"configId":4,
"actions":[
{
"cmd":"doAction4"
}
],
"type":"weekly",
"time":"09:00",
"weekday":[
5
]
},
{
"configId":5,
"actions":[
{
"cmd":"doAction5"
}
],
"type":"weekly",
"time":"22:00",
"weekday":[
4
]
}
]
我想實作這一點:
"ActionConfiguration": [
{
"configId": 1,
"actions": [
{
"cmd": "doAction1"
},
{
"cmd": "doAction2"
},
{
"cmd": "doAction3"
},
{
"cmd": "doAction4"
}
],
"type": "weekly",
"time": "09:00",
"weekday": [
5
]
},
{
"configId": 2,
"actions": [
{
"cmd": "doAction5"
}
],
"type": "weekly",
"time": "22:00",
"weekday": [
4
]
}
]
如您所見,我想將需要同時執行的操作合并到一個串列中。我來自 Java 背景,目前正在研究 Scala。我知道如何以 Java 風格解決這個問題,但我正在尋找一些方法來解決這個問題,因為我對學習函式式編程非常感興趣。
uj5u.com熱心網友回復:
假設有一個 ActionConfiguration 的建構式按以下順序獲取成員,這可能有效(我只是在這里鍵入它,我沒有編譯或測驗它):
val mergedList = listofActionConfigurations
.groupBy(a => (a.configId, a.time, a.type, a.weekday))
.values
.map(la => (la.head, la.map(_.actions).flatten))
.map(t => new ActionConfiguration(t._1.configId, t._1.time, t._1.type, t._1.weekday, t._2))
.toList
這里發生了什么事?
我們通過一個鍵對 ActionConfigurations 串列進行分組,該鍵是通過對除了操作串列之外的所有 ActionConfigurations 欄位進行元組處理而創建的。
然后我們扔掉鍵,只取值,這是一些包含 ActionConfiguration 串列的類似 Set 的集合。
我們映射該集合,并且對于其中的每個 ActionConfiguration 串列,我們獲取串列的第一個元素 (.head),然后我們將串列中的每個 ActionConfiguration 映射到它的操作串列,然后我們將結果串列展平串列。我們產生一個頭項和扁平串列的元組。
然后,我們將元組(頭部,動作串列)映射到一個新的 ActionConfiguration 中,除了它的動作串列之外,頭部的所有成員,以及扁平化的動作串列作為新的 ActionConfiguration 的動作串列。
最后,由于我們可能還有一個類似 Set 的集合,我們明確地將其轉換為 List。
解釋比寫要花更長的時間。:)
請注意,Scala 庫檔案不保證合并操作串列中的操作順序(但實作似乎是保持順序的);如果您需要對其進行排序,請在展平然后操作串列后進行排序。
uj5u.com熱心網友回復:
如果您真的想要一個,您似乎只需要groupMapReduce創建一個Map[TargetLocation, List[Action]]您以后可以使用的mapMap[TargetLocation, List[ActionConfiguration]]
configurations.groupMapReduce(
ac => (ac.configId, ac.time, ac.type, ac.weekday)
)(
ac => ac.actions
)(
(l1, l2) => l1 reverse_::: l2 // Similar to l1 l2 but more efficient, although the order changes.
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444248.html
上一篇:未呼叫伴隨物件中宣告的隱式轉換
