加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala函数使用泛型函数的映射对Seq进行排序

发布时间:2020-12-16 09:54:18 所属栏目:安全 来源:网络整理
导读:我正在尝试编写一个函数,用函数F映射序列S(我称之为F(S)),用S将结果值(F(S))拉开,然后用F(S)对结果进行排序),返回排序的压缩值(我希望代码清除它,很难放入文本) 这是我目前的代码: def sortByAndReturnZippedMetric[S,M:Ordering[AnyVal]]( s:Seq[S],mapper
我正在尝试编写一个函数,用函数F映射序列S(我称之为F(S)),用S将结果值(F(S))拉开,然后用F(S)对结果进行排序),返回排序的压缩值(我希望代码清除它,很难放入文本)

这是我目前的代码:

def sortByAndReturnZippedMetric[S,M<:Ordering[AnyVal]]( s:Seq[S],mapper:S=>M):Seq[(M,S)] =
s.map(mapper).zip(s).sortBy(_._1)

Scalac抱怨说:

error: diverging implicit expansion for type scala.math.Ordering[M]
starting with method comparatorToOrdering in trait LowPriorityOrderingImplicits
s.map(mapper).zip(s).sortBy(_._1)

                               ^

我会对可能出错的一些指点表示赞赏……

解决方法

排序是一个 type class,这意味着如果你想捕获A以特定方式排序的事实,你只需将Ordering [A]的隐式实例放入范围 – 你没有A extend Ordering [A](或订购[AnyVal]等).

这种方法的优点是您可以处理特定类型的多个排序(尽管一种类型的一次只能有一个隐式排序).例如,我可以编写以下内容:

scala> List(5,2,3,1,4).sorted
res0: List[Int] = List(1,4,5)

这里整数的隐式排序(Ordering.Int)用作排序的隐式参数,但我们也可以显式传递不同的Ordering.例如,我们可以通过反转隐式排序来创建新的排序:

scala> List(5,4).sorted(Ordering.Int.reverse)
res1: List[Int] = List(5,1)

在你的情况下,sortBy正在寻找一个不存在的订购[Ordering [AnyVal]].您可以使用context bound轻松解决此问题,表明您需要订购M,而不是M扩展订购[AnyVal]:

def sortByZipped[S,M: Ordering](s: Seq[S],mapper: S => M): Seq[(M,S)] =
  s.map(mapper).zip(s).sortBy(_._1)

或者你可以跳过语法糖并使用隐式参数:

def sortByZipped[S,M](s: Seq[S],mapper: S => M)(implicit o: Ordering[M]) =
  s.map(mapper).zip(s).sortBy(_._1)(o)

这完全等同于具有上下文绑定的版本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读