【问题标题】:count occurrences of elements [duplicate]计算元素的出现次数[重复]
【发布时间】:2012-06-11 15:49:21
【问题描述】:

计算列表中的所有元素在 Haskell 中是单行的:

count xs = toList (fromListWith (+) [(x, 1) | x <- xs])

这是一个示例用法:

*Main> count "haskell scala"
[(' ',1),('a',3),('c',1),('e',1),('h',1),('k',1),('l',3),('s',2)]

这个函数在 Scala 中也能如此优雅地表达吗?

【问题讨论】:

  • 无意义版本:toList . fromListWith (+) . map (,1).
  • @sdcvvc 元组部分现在是标准的 Haskell 吗?
  • 不是 H2010,但 IMO 相当标准。
  • @sdcvvc 我在哪里可以找到这个“imo 非常标准”? ;)

标签: scala list haskell dictionary list-comprehension


【解决方案1】:
scala> "haskell scala".groupBy(identity).mapValues(_.size).toSeq
res1: Seq[(Char, Int)] = ArrayBuffer((e,1), (s,2), (a,3), ( ,1), (l,3), (c,1), (h,1), (k,1))

【讨论】:

  • 对更短的定义很奇怪;)但至少它也是单线;)
  • @Nicolas,我写的时候最后没有.toSeq。 ;) 现在将其删除。
【解决方案2】:

从 Data.List 库中调用 group

group :: [a] -> [[a]]

给我们:

map (head &&& length) . group . sort

一个列表友好且相对“幼稚”的实现。

【讨论】:

  • 哇,我不知道&amp;&amp;&amp; 运算符,太酷了!
  • 虽然这很酷,但问题是如何在 Scala 中实现它。
  • 这个问题错误地认为使用中间容器和列表理解是 Haskell 中的一种优雅方法:)
  • 在时间复杂度方面,您的解决方案与我的解决方案相比如何?
  • @FredOverflow 它们具有相同的复杂性。
【解决方案3】:

另一种实现:

def count[A](xs: Seq[A]): Seq[(A, Int)] = xs.distinct.map(x => (x, xs.count(_ == x)))

【讨论】:

    【解决方案4】:

    要直译,我们试试这个:

    // Implementing this one in Scala
    def fromSeqWith[A, B](s: Seq[(A, B)])(f: (B, B) => B) =
        s groupBy (_._1) mapValues (_ map (_._2) reduceLeft f)
    
    def count[A](xs: Seq[A]) = fromSeqWith(xs map (_ -> 1))(_+_).toSeq
    

    Scala 的 groupBy 使这变得比它需要的更复杂 - 有人呼吁 groupWithgroupInto,但他们并没有制定 Odersky 的标准库包含标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2015-12-11
      • 2022-11-30
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多