1

次のデータ型を変換するコードがあります。

from: SortedMap[Long, SortedMap[String, Double]] to: SortedMap[String, Array[Double]]

このコードが上記の操作を行う方法を誰か説明してもらえますか?

val convertedDataWindow = dataWindow.values.foldLeft(SortedMap.empty[String, Array[Double]]) {
  case (res0, map) =>
    (res0 /: map) {
      case (res1, (key, value)) =>
        res1.updated(key, res1.getOrElse(key, Array.empty) :+ value)
    }
}
4

1 に答える 1

2

最初に内部関数を単独で検討します。

def something(res0: SortedMap[String, Array[Double]],
  map: SortedMap[String, Double]) = (res0 /: map) {
  case (res1, (key, value)) =>
    res1.updated(key, res1.getOrElse(key, Array.empty) :+ value)
}

/:は の別名でfoldLeft、これは と同じです

map.foldLeft(res0) { ...}

foldLeft一般的にどのように機能するか知っていますか?指定された関数を使用して各値を順番に初期値に「マージ」し、コレクション全体を実行します。したがって、これは で始まり、res0すべて(key, value)の inmapについて、 を使用して作業結果にマージします: keyと valueを使用.updatedして、マップに新しいエントリを追加します。つまり、このキーのエントリが既に存在する場合は、その末尾に追加します。それ以外の場合は、だけを含む新しいものを作成します。keyres1.getOrElse(key, Array.empty) :+ valuevalueArrayvalue

したがって、これらすべてをまとめると、この関数が行っていることは、新しいキーの新しいエントリを作成するか、既存のキーの に値を配置することによって、 にマージmapすることです。res0Array

今、完全な機能は別のことをしていfoldLeftます; 次のように書くことができます。

dataWindow.values.foldLeft(SortedMap.empty)(something)

つまり、これが行っていることは、空のマップから開始し、次にそれぞれをdataWindow.values作業マップにマージすることです。

(もちろん、「マージ」について話すとき、実際にはすべてが不変であり、ループを通過するたびに新しい「作業」マップを作成しています。しかし、単一の変更可能な「作業」マップを想像する方が明確な場合もありますres

于 2014-12-04T09:45:48.113 に答える