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

标签 scala sorting mapping

我正在尝试编写一个函数,通过函数 F(我将其称为 F(S))映射序列 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)

                               ^

我会很感激一些关于可能出错的指示......

最佳答案

Orderingtype class ,这意味着如果你想捕捉 A以特定方式排序,您只需放置 Ordering[A] 的隐式实例进入范围——你没有 A延长 Ordering[A] (或 Ordering[AnyVal] 等)。

这种方法的优点是您可以使用特定类型的多个排序(尽管一次只能在一个类型的范围内使用一个隐式排序)。因此,例如,我可以编写以下内容:

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

这里整数的隐式排序 ( Ordering.Int ) 用作 sorted 的隐式参数。 ,但我们也可以显式传递不同的 Ordering .例如,我们可以通过反转隐含的顺序来创建新的顺序:
scala> List(5, 2, 3, 1, 4).sorted(Ordering.Int.reverse)
res1: List[Int] = List(5, 4, 3, 2, 1)

在你的情况下sortBy正在寻找 Ordering[Ordering[AnyVal]] ,这是不存在的。您可以使用 context bound 轻松解决此问题表示您需要订购 M , 而不是 M延长 Ordering[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)

这完全等同于上下文绑定(bind)的版本。

关于使用泛型函数的映射对 Seq 进行排序的 Scala 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13555891/

相关文章:

javascript - 你可以隐藏由数组渲染的某些 react 片段吗?

c++ - 对具有许多缓存未命中的 1000-2000 个元素进行排序

json - Jackson JSON 到 Java 映射,用于具有不同数据类型的相同属性

javascript - 映射具有两种不同样式的数组=奇数数组具有一种样式,偶数数组具有另一种样式

node.js - 在node.js中将include_type_name参数设置为true

scala - 列表的 Fold 和 Fold[Right/Left] 方法的签名差异

scala - Scala 中的 flatMap 实现

Scala 适配器模式 - 自动允许具有相同方法的类使用 "duck typing"

scala - 如何在 SBT 中获取已解析 ModuleID 的文件系统的完整类路径?

javascript - 这个 jQuery 排序函数是如何工作的?