【问题标题】:scala comparator like function for sequencesscala 比较器类似序列的函数
【发布时间】:2014-09-25 08:53:07
【问题描述】:

鉴于我有两个Seq[M] 和一个类似函数compare(m1:M, m2:M):Int 的比较器,我将如何为这两个序列编写类似比较器的函数。

def compare[M](s1:Seq[M], s2:Seq[M], cmp:(M,M)=>Int) : Int = {
  ???
}

我自己在序列上迭代来实现这一点没有问题,但我确信 Scala 库中已经准备好了一些东西。我查看了 Ordering 类和对象,但在查看所有隐式树的森林时遇到问题。

编辑:使用seqDerivedOrdering 的任何方式都可以在 https://github.com/scala/scala/blob/v2.11.2/src/library/scala/math/Ordering.scala#L1不是抄码?

【问题讨论】:

    标签: scala comparator seq


    【解决方案1】:

    您可以使用seqDerivedOrdering,但您仍然必须提供隐式排序,因为它不需要(M,M) => Int。你可以试试这样的:

      def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int): Int = {
    
        implicit val orderM = new Ordering[M] {
          override def compare(x: M, y: M): Int = cmp(x, y)
        }
    
        scala.math.Ordering.Implicits.seqDerivedOrdering[Seq, M].compare(s1, s2)
      }
    

    也许相同代码的更好版本:

      def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int): Int = {
    
        import scala.math.Ordering.Implicits._
    
        implicit val orderM = new Ordering[M] {
          override def compare(x: M, y: M): Int = cmp(x, y)
        }
    
        implicitly[Ordering[Seq[M]]].compare(s1, s2)
      }
    

    或者,我们可以做得更好:

      import scala.math.Ordering.Implicits._
    
      def compare[M](s1: Seq[M], s2: Seq[M])(cmp: (M, M) => Int)(implicit ord: Ordering[Seq[M]]): Int = {
    
        implicit val orderM = new Ordering[M] {
          override def compare(x: M, y: M): Int = cmp(x, y)
        }
    
        ord.compare(s1, s2)
      }
    

    【讨论】:

    • 阅读docs.scala-lang.org/tutorials/tour/implicit-parameters.html后,我开始理解最后一个。唉,orderM 似乎不再需要了。至少它适用于 List[Int] 和 List[String] 没有。-) 然后它真的很好很简单。
    • 嗯,哦,现在我明白了。没有 orderM,我的 cmp 永远不会被使用。
    【解决方案2】:

    据我所知,没有内置任何东西。最紧凑的可能是这样的

    def compare[M](s1: Seq[M], s2: Seq[M], cmp: (M, M) => Int): Int = {
      val diff = (s1 zip s2).find(x => cmp(x._1, x._2) != 0)
      diff.map(x => cmp(x._1, x._2)).getOrElse(s1.length compare s2.length)
    }
    

    使用迭代器的解决方案效率更高,但不那么紧凑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多