不幸的是, 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
的就地排序将是理想的。
最佳答案
使用 sortWith
作为 drexin 所说的最简单的一次性使用,但有几个注意事项:
1) sort
已弃用,所以不要使用它。文档告诉您改用 sortWith
。
2) Ordering
是一个类型类,所以事情不会扩展它(不像 Ordered
)。您只需要在隐式范围内有一个,它通常在一个伴随对象中。但是 Position
没有同伴。所以你可以自己添加隐式:
implicit val posOrd: Ordering[Position] = Ordering.fromLessThan(_ < _)
然后
semanticErrors.sortBy(_.pos)
应该可以工作。
关于scala - 按位置对 ListBuffer 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055477/