如何计算2个列表中元素出现的乘积?

Lon*_*ive 1 methods scala function list

我创建了一个函数,该函数计算列表中元素的出现次数,如果我传递字符串,

"d b d b d"
Run Code Online (Sandbox Code Playgroud)

进入函数,然后它将返回

(b -> 2, d -> 3)
Run Code Online (Sandbox Code Playgroud)

现在我要做的是创建一个新函数,该函数同时具有两个参数List [String]

def foo(a: List[String], b: List[String]) : Int = {

}
Run Code Online (Sandbox Code Playgroud)

可以说我通过了

List("a", "b", "b", "c", "d") 
occurrences of this list = (a -> 1, b -> 2, c -> 1, d -> 1)

List("d", "b", "d", "b", "d")
occurrences of this list = (b -> 2, d -> 3)
Run Code Online (Sandbox Code Playgroud)

进入此函数,它将计算每个列表中每个元素的出现次数,然后计算列表之间每个出现次数的乘积。因此,通过这两个列表的预期答案将是7:

1*0 + 2*2 + 1*0 + 1*3 = 7
 a     b     c     d 
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Mah*_*afy 7

你可以这样做:

  def count(string: String): Map[String, Int] =
    string.split(" ").groupBy(identity).mapValues(_.length)

  def multiply(m1: Map[String, Int], m2: Map[String, Int]): Map[String, Int] = {
    val allKeys = m1.keySet.union(m2.keySet)
    allKeys.map(key => key -> m1.getOrElse(key, 0) * m2.getOrElse(key, 0)).toMap
  }

  val freq1 = count("a b b c d")
  val freq2 = count("d b d b d")

  val multiplied = multiply(freq1, freq2)
  val sum = multiplied.values.sum
Run Code Online (Sandbox Code Playgroud)