4

不幸的是,scala.util.parsing.input.Position没有扩展Ordering[Position]

ListBuffer要根据位置对错误进行排序,我使用以下代码:

semanticErrors.sortBy(_.pos)(new Ordering[Position] {
  def compare(x: Position, y: Position): Int = x.line - y.line 
}).toList

我相信这可以做得更优雅。但是怎么做?例如,我注意到Position实现<. 是否有一个通用包装器可以将支持的东西<变成Ordering?


有趣的是,当转换为第一个时,这似乎要容易得多List

semanticErrors.toList.sort((a, b) => a.pos < b.pos)

但这可能不是最有效的解决方案。就地的那种ListBuffer将是理想的。

4

2 回答 2

8

ListBuffer您可以使用以下方法对 a 进行排序sortWith

semanticErrors.sortWith(_.pos < _.pos)
于 2012-08-21T13:18:26.603 回答
4

使用sortWithdrexin 说的一次性使用是最简单的,但有几点注意事项:

1)sort已弃用,所以不要使用它。文档告诉您sortWith改用。

2)Ordering是一个类型类,所以不会扩展它(不像Ordered)。您只需要在隐式范围内拥有一个,通常在伴随对象中。然而Position没有同伴。所以你可以自己添加隐式:

implicit val posOrd: Ordering[Position] = Ordering.fromLessThan(_ < _)

然后semanticErrors.sortBy(_.pos)应该工作。

于 2012-08-21T17:56:16.553 回答