gpt4 book ai didi

Scala reduceByKey 函数 - 使用任何具有 + 方法的类型

转载 作者:行者123 更新时间:2023-12-03 03:52:50 25 4
gpt4 key购买 nike

我正在编写一个名为reduceByKey的简单函数,它接受(键,数字)对的集合并按键返回缩减的集合。

  def reduceByKey[K](collection: Traversable[Tuple2[K, Int]]) = {    
collection
.groupBy(_._1)
.map { case (group: K, traversable) => traversable.reduce{(a,b) => (a._1, a._2 + b._2)} }
}

目前适用于:

scala> val col = List((("some","key"),100), (("some","key"),100), (("some","other","key"),50))
col: List[(Product with Serializable, Int)] = List(((some,key),100), ((some,key),100), ((some,other,key),50))

scala> reduceByKey(col)
res42: scala.collection.immutable.Map[Product with Serializable,Int] = Map((some,key) -> 200, (some,other,key) -> 50)

但是,一旦我想使用非 Int 类型作为数字,它就会惨败,因为它需要一个 Int

scala> val col = List((("some","key"),100.toDouble), (("some","key"),100.toDouble), (("some","other","key"),50.toDouble))
col: List[(Product with Serializable, Double)] = List(((some,key),100.0), ((some,key),100.0), ((some,other,key),50.0))

scala> reduceByKey(col)
<console>:13: error: type mismatch;
found : List[(Product with Serializable, Double)]
required: Traversable[(?, Int)]
reduceByKey(col)
^

当然,我可以为不同的类型制定不同的方法,但这很愚蠢。基本上我希望我的方法能够与定义了 + 方法的任何类型一起使用。这将是 DoubleFloatLongIntShort。 p>

  1. 起初,我认为可以使用结构类型代替 Int。但这意味着结构类型需要引用自身才能发挥作用。
  2. 我调查了Numeric我认为可能有用的特征。它封装了所有数值类型的+方法。但是,我不确定如何在我的情况下使用它。我不想强制我的函数的用户将值包装在数字中,只是为了我的函数能够工作。函数本身应该以某种方式隐式包装它并调用 Numeric.plus

我愿意接受任何有关如何解决此问题的建议。

最佳答案

如果您只对数值感兴趣,则可以使用标准 Numeric 类型类并执行以下操作:

def reduceByKey[K,V](collection: Traversable[Tuple2[K, V]])(implicit num: Numeric[V]) = {    
import num._
collection
.groupBy(_._1)
.map { case (group: K, traversable) => traversable.reduce{(a,b) => (a._1, a._2 + b._2)} }
}

num隐式参数充当V是数字类型的证据,并为该类型提供+操作。

关于Scala reduceByKey 函数 - 使用任何具有 + 方法的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com