从Scala中订购订购

时间:2017-04-16 16:29:48

标签: scala sorting scala-collections comparable

给定具有特征Ordered的对象,是否有任何方法可以获得与原始对象使用相同比较的Ordering

我想要这样做的原因是我已经使用以下签名实现了合并排序(Manifest只是为了我可以实例化新的List[T]Array[T] s :

def mergeSorted[T : Manifest](li: List[T], ord: Ordering[T]) : List[T]

我想要做的是使用带有此签名的方法重载此内容:

def mergeSorted[T <: Ordered[T] : Manifest](li: List[T]) : List[T]

这样,如果我正在排序Int,我就不必手动说出Int订单。在我看来,实现这一点的简单方法就是以某种方式从Ordering[T]获得TScalaDoc似乎表示这可能是通过暗示来实现的:

  

Ordered和Ordering都提供了允许它们互换使用的含义。

但是,我不知道要导入哪些内容才能执行此操作。

2 个答案:

答案 0 :(得分:1)

math.Orderingmath.Ordered都可以分别通过implicit parameterimplicit conversion达到您的需要。根据使用哪一个,mergeSort函数将具有类似于以下之一的签名:

// Using math.Ordering
def mergeSort[T](li: List[T])(implicit order: Ordering[T]): List[T] = {
  ...
}

// Using math.Ordered
def mergeSort[T <% Ordered[T]](li: List[T]): List[T] = {
  ...
}

有关详细信息,您可能会对此通用合并排序blog post感兴趣。

答案 1 :(得分:1)

如果你定义:

def mergeSorted[T : Ordering : Manifest](li: List[T]) : List[T]

编译器会把它变成

def mergeSorted[T : Manifest](li: List[T])(implicit ev: Ordering[T]) : List[T]

一切都会按照您的意愿运作。