1
我有一個映射減少代碼,我通過某個鍵在每個線程中分組,然後在reduce部分中合併結果。我目前的做法是尋找在累加器的特定密鑰索引,然後MAPI只爲這個鍵檢索綜合作用的結果,留下其餘不變:基於鍵的功能摺疊
let rec groupFolder sequence acc =
match sequence with
| (by:string, what) :: rest ->
let index = acc |> Seq.tryFindIndex(fun (byInAcc, _) -> byInAcc.Equals(by))
match index with
| Some (idx) ->
acc |> Seq.mapi(fun i (byInAcc, whatInAcc) -> if i = idx then (by, (what |> Array.append whatInAcc)) else byInAcc, whatInAcc)
|> groupFolder rest
| None -> acc |> Seq.append(seq{ yield (by, what) })
|> groupFolder rest
我的問題是,是它功能更強的方式實現這一目標?
由於輸入到該減速器
let GroupsCommingFromMap = [| seq { yield! [|("key1", [|1;2;3|]); ("key2", [|1;2;3|]); ("key3", [|1;2;3|]) |] }, seq { yield! [|("key1", [|4;5;6|]); ("key2", [|4;5;6|]); ("key3", [|4;5;6|]) |] } |];;
GroupsCommingFromMap |> Seq.reduce(fun acc i ->
acc |> groupFolder (i |> Seq.toList))
一個例子,預期的結果應包含所有key1..key3每個陣列1..6
謝謝Tomas爲您解答。我添加了一個來自mapper的示例結果以及我期待的內容。所以按羣組是答案。當然,那麼我可以簡單地追加第二次減少。我已經在舌尖了。 – user3853059
@ user3853059添加了一個樣本來處理您描述的情況。 –
哦,我忘了提到映射器自己做了一個group,它只是以我在示例中給出的格式返回組。再次感謝您的回答 – user3853059