按Scala中的部分顺序排序

时间:2016-11-04 12:44:27

标签: scala sorting partial-ordering

Partially sorting collections in Scala询问如何按Scala中的PartialOrdering进行排序。注释表明作者不应该在给出的示例中进行部分排序。我需要按部分排序排序 - 我的国家可能是其他国家的飞地,这会导致部分排序。

所以:给定List[T],其中T扩展PartialOrdering[T],是否有一种合理的方式根据偏序进行排序?

1 个答案:

答案 0 :(得分:0)

我自己写了一篇合适的文章。像这样的案例总让我觉得我错过了一个标准的库函数。

  def sortByPartialOrdering[T](ts: Array[T], lessThan: (T, T) => Boolean): ListBuffer[T] = {
    val len = ts.size
    val visited = Array.fill[Boolean](len)(false)
    val postOrder = ListBuffer.empty[Int]

    def visit(n: Int): Unit = {
      visited(n) = true
      for (i <- 0 until len)
        if (!visited(i) && lessThan(ts(i), ts(n)))
          visit(i)
      postOrder += n
    }

    for (i <- 0 until len)
      if (!visited(i))
        visit(i)

    assert(postOrder.size == len)

    postOrder map ts
  }

欢迎评论/改进 - 我不会写那么多Scala。