を返すために、カスタムタイプの2つのベクトルを組み合わせる:私はクラスを持っている1つのベクトル
これら二つのリストを考えるとcase class Custom(label: String, num: Long)
:
val l1 = Vector(Custom("a", 1), Custom("aa", 1))
val l2 = Vector(Custom("a", 1))
私は結果のリストを取得したい:
val l3 = Vector(Custom("a", 2), Custom("aa", 1))
私はこのようにfoldを使用しようとしました:
l1.foldLeft(l2)((acc: List[Custom], el: Custom) => {
val itemWithIndex: Option[(Custom, Int)] = acc.zipWithIndex.find(_._1.label == el.label)
itemWithIndex match {
case Some(x) => acc.updated(x._2, Custom(el.label, acc(x._2).num + el.num))
case None => el :: acc
}
})
この実装は、アキュムレータ(l2
)を3回、l1
を1回反復します。私はより効率的なソリューションを探しています。
クール。何を試しましたか? – Jubobs
foldLeftここで、アキュムレータは2番目のリストとして開始します。次に、最初のリストの各項目について、存在するかどうかをチェックし、存在する場合は値を追加し、そうでない場合は新しい要素として値を挿入します。あまり効率的ではありません。何かが存在するかどうかを確認するためにリスト全体を反復し、そして再びその位置を得るために再び繰り返す。 – soote
あなたの質問を編集し、そこであなたのアプローチを説明してください。あなたの質問を自己完結させる。 – Jubobs