按位置排序ListBuffer

时间:2012-08-21 13:03:43

标签: scala sorting position traits

不幸的是,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的就地排序是理想的。

2 个答案:

答案 0 :(得分:8)

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

semanticErrors.sortWith(_.pos < _.pos)

答案 1 :(得分:4)

使用sortWith,因为drexin说这是一次性的最简单,但有几个注意事项:

1){@ 1}}已弃用,因此请勿使用它。文档会告诉您改为使用sort

2)sortWith是类型类,所以事情不会扩展它(与Ordering不同)。您只需要在隐式作用域中有一个,通常在伴随对象中。但是Ordered没有伴侣。所以你可以自己添加隐含的内容:

Position

然后implicit val posOrd: Ordering[Position] = Ordering.fromLessThan(_ < _) 应该有用。