0

我正在尝试解决以下问题:

val temp1 = (3, "hello")
val temp2 = (2, "abcde")
temp1 <= temp2

返回错误

<console>:24: error: value <= is not a member of (Int, String)
              temp1 <= temp2
                    ^

我尝试将以下内容添加到我的代码中:

implicit val tempOrdering = new Ordering[(Int, String)] {
  override def compare(a: (Int, String), b: (Int, String)): Int =
    {
    if      (a._1 < b._1) { -1 }
    else if (a._1 > b._1) { 1 }
    else if (a._2 < b._2) { -1 }
    else if (a._2 > b._2) { 1 }
    else 0
    }
  override def lteq(a: (Int, String), b: (Int, String)): Boolean = compare(a, b) <= 0
}

implicit val tempPartialOrdering = new PartialOrdering[(Int, String)] {
  override def tryCompare(a: (Int, String), b: (Int, String)): Option[Int] = {
    if      (a._1 < b._1) { Some(-1) }
    else if (a._1 > b._1) { Some(1) }
    else if (a._2 < b._2) { Some(-1) }
    else if (a._2 > b._2) { Some(1) }
    else Some(0)
  }
  override def lteq(x: (Int, String), y: (Int, String)) = {
    tryCompare(x, y).map(_ <= 0).getOrElse(false)
  }
}

并且 temp1 <= temp2 仍然不起作用。

我能够运行诸如

List(temp1, temp2).min

但不是

min(temp1, temp2)

所以似乎 scala 没有看到我对 (Int, String) 元组的排序声明。

我可以使用引用我的声明

tempPartialOrdering.lteq(temp1, temp2)

我的一些同事建议为 (Int, String) 元组创建一个新类,但我发现这些解决方案不优雅。我真的很想能够使用普通的旧“<=”比较运算符!

有谁知道我做错了什么,“<=”仍然不是(Int,String)的成员?有没有办法隐式设置它?

4

3 回答 3

4

试试这个:

scala> import Ordering.Implicits._
import Ordering.Implicits._

scala> (2,3) <= (1,2)
res2: Boolean = false
于 2015-09-10T18:10:54.153 回答
0

你的同事是对的。创建一个自定义类型(又名类)。它比你想象的要优雅得多。

于 2015-09-10T18:02:47.793 回答
0

我只会做以下事情。您可以根据需要扩展它以获得额外的功能。它很笨重,但它可以完成工作并允许您提出自定义订购。

implicit class stringIntTuple(a: (String, Int)) extends (String, Int)(a._1,a._2) {
  def <= (x: (String, Int)): Boolean = {
    this._2 <= x._2
  }
}

temp1 <= temp2
于 2015-09-10T18:13:46.310 回答