【问题标题】:Counting occurrences of elements without .groupBy计算没有 .groupBy 的元素的出现次数
【发布时间】:2014-11-22 20:22:59
【问题描述】:

我需要计算列表中元素的出现次数。

列表如下所示:List[(String, String, Int)] - (String, String, Int) 元组列表。

例子:

List(("Gregor", "Math", 6), ("Mark", "Math", 33), 
     ("Gregor", "IT", 44),  ("Jane", "Math", 3), 
     ("Mark", "Geography", 44), ("Gregor", "sdf", 32))

我需要返回对列表(名称,列表中的出现) 对于这个例子,它应该是

List(("Gregor", 3), ("Mark", 2), ("Jane", 1))

我尝试使用 map 和 foldLeft,但我不知道该怎么做

【问题讨论】:

  • 看看groupBy函数?
  • 这个任务我只能使用 map、foldleft、foldright 和 filter。
  • 这是作业吗?你试过什么?

标签: list scala scala-collections


【解决方案1】:

你可以只使用foldLeft

val t = List(("Gregor", "Math", 6), ("Mark", "Mat", 33), 
    ("Gregor", "IT", 44), ("Jane", "Math", 3), ("Mark", "Geography", 44), 
    ("Gregor", "sdf", 32))

val res = t.foldLeft(Map[String, Int]()) { case(m, (n, _, _)) => 
    m + (n -> (m.getOrElse(n, 0) + 1)) 
}.toList

【讨论】:

  • 我猜你必须使用 toList 对吧?至少,否则你将拥有真正可怕的复杂性。
【解决方案2】:
users.groupBy(u => u._1).map(u => (u._1, u._2.length)).toList

【讨论】:

  • groupBy 不能用,这也是我的第一个想法。
  • 嗯。奇怪的约束,但是好的,我会考虑一下。还有其他限制吗?
  • 查看问题上的cmets,他确实说过我们只能使用foldLeftfoldRightmapfilter。这显然是一个家庭作业问题,但仍然很有趣。
【解决方案3】:
scala> val list = List(("Gregor", "Math", 6), ("Mark", "Mat", 33), ("Gregor", "IT", 44), ("Jane", "Math", 3), ("Mark", "Geography", 44), ("Gregor", "sdf", 32))
list: List[(String, String, Int)] = List((Gregor,Math,6), (Mark,Mat,33), (Gregor,IT,44), (Jane,Math,3), (Mark,Geography,44), (Gregor,sdf,32))

scala> val res = list.groupBy(_._1) map { case (k, xs) => k -> xs.size } toList
res: List[(String, Int)] = List((Gregor,3), (Jane,1), (Mark,2))

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2012-06-11
    • 1970-01-01
    • 2022-11-30
    • 2020-06-09
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多