scala - 按位置对 ListBuffer 进行排序

标签 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 的就地排序将是理想的。

最佳答案

使用 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/

相关文章:

java - ArrayList 未填充

css - 一页上的粘滞按钮

javascript - 当我添加绝对位置时,UL 背景不显示

html - 绝对定位在滚动溢出容器内

generics - 在 Scala 中是否可以强制调用者为多态方法指定类型参数?

scala - Array[Byte] hashCode() 在 Scala 中每次返回不同的值

sorting - CUDA 推力和 sort_by_key

c# - Winforms ListView C# 中的 collection.Insert(0, newItem) 与 list.Add(newItem) + Sort 更快吗?

java - “ hive 上的 Spark ”-原因:java.lang.ClassNotFoundException:org.apache.hive.spark.counter.SparkCounters

scala - 自定义 Spray.io 指令来验证请求 header 值