Scala列表列表中元素出现的次数
为了简单起见,让我们假设我有以下输入:Scala列表列表中元素出现的次数,scala,list,functional-programming,Scala,List,Functional Programming,为了简单起见,让我们假设我有以下输入: List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C")) 如何能够以这种方式将列表中的元素分组,以便我知道它们在多少个列表中。例如,在mapValues函数的输出之后,为了说明我的意思,前面输入的结果应该如下所示: Map("A" -> 2, "B" -> 3, "C" -> 2) 为了明确我的意思,解释结果的一种方法是说“a”出现在2个子列表中(无论它出
List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
如何能够以这种方式将列表中的元素分组,以便我知道它们在多少个列表中。例如,在mapValues函数的输出之后,为了说明我的意思,前面输入的结果应该如下所示:
Map("A" -> 2, "B" -> 3, "C" -> 2)
为了明确我的意思,解释结果的一种方法是说“a”出现在2个子列表中(无论它出现在特定子列表中多少次),“B”出现在3个子列表中,“C”出现在2子列表中。我只是想要一种方法来映射每个元素中有多少不同的子列表 忽略性能,这将起作用:
val list = List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
val elements = list.flatten.distinct
elements.map(el => el -> list.count(_.contains(el))).toMap
不考虑性能,这将起作用:
val list = List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
val elements = list.flatten.distinct
elements.map(el => el -> list.count(_.contains(el))).toMap
您也可以使用
折叠
操作来完成此操作
list.flatten.foldLeft(Map.empty[String, Int])((map, word) => map + (word -> (map.getOrElse(word,0) + 1)))
//scala> res2: scala.collection.immutable.Map[String,Int] = Map(A -> 3, B -> 3, C -> 2)
您也可以使用
折叠
操作来完成此操作
list.flatten.foldLeft(Map.empty[String, Int])((map, word) => map + (word -> (map.getOrElse(word,0) + 1)))
//scala> res2: scala.collection.immutable.Map[String,Int] = Map(A -> 3, B -> 3, C -> 2)
@XavierGuihot只计算每个字母出现的次数,而不是询问的内容。@n这就是我要说的,谢谢@XavierGuihot只计算每个字母出现的次数,而不是询问的内容。@n这就是我要说的,谢谢!这非常有效,仍然适合我的解决方案,但是对于所给出的简化,它非常有效,谢谢!这非常有效,仍然适合我的解决方案,但是对于所给出的简化,它非常有效,谢谢!不是预期的结果。这计算了每个“单词”的总出现次数,这不是OP要求的。即使是像我提供的一个简单案例,输出结果也与您的不同,这一事实表明您提出的不是我想要的。无论如何谢谢你!不是预期的结果。这计算了每个“单词”的总出现次数,这不是OP要求的。即使是像我提供的一个简单案例,输出结果也与您的不同,这一事实表明您提出的不是我想要的。无论如何谢谢你!