如何让 lteq <= 运算符在 Scala 中使用元组?
how do I get the lteq <= operator to work with tuples in Scala?
我正在尝试修复以下问题:
val temp1 = (3, "hello")
val temp2 = (2, "abcde")
temp1 <= temp2
哪个returns错误
<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) 元组制作一个新的 class,但我发现这些解决方案不够优雅。我真的很想能够使用普通的旧“<=”比较运算符!
有谁知道我做错了什么,“<=”仍然不是 (Int, String) 的成员?有没有办法隐式设置它?
你的同事是对的。创建自定义类型(又名 class)。它比您认为的要优雅得多。
试试这个:
scala> import Ordering.Implicits._
import Ordering.Implicits._
scala> (2,3) <= (1,2)
res2: Boolean = false
我只会执行以下操作。您可以根据需要扩展它以获得额外的功能。它很笨重,但可以完成工作并允许您提出自定义排序。
implicit class stringIntTuple(a: (String, Int)) extends (String, Int)(a._1,a._2) {
def <= (x: (String, Int)): Boolean = {
this._2 <= x._2
}
}
temp1 <= temp2
我正在尝试修复以下问题:
val temp1 = (3, "hello")
val temp2 = (2, "abcde")
temp1 <= temp2
哪个returns错误
<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) 元组制作一个新的 class,但我发现这些解决方案不够优雅。我真的很想能够使用普通的旧“<=”比较运算符!
有谁知道我做错了什么,“<=”仍然不是 (Int, String) 的成员?有没有办法隐式设置它?
你的同事是对的。创建自定义类型(又名 class)。它比您认为的要优雅得多。
试试这个:
scala> import Ordering.Implicits._
import Ordering.Implicits._
scala> (2,3) <= (1,2)
res2: Boolean = false
我只会执行以下操作。您可以根据需要扩展它以获得额外的功能。它很笨重,但可以完成工作并允许您提出自定义排序。
implicit class stringIntTuple(a: (String, Int)) extends (String, Int)(a._1,a._2) {
def <= (x: (String, Int)): Boolean = {
this._2 <= x._2
}
}
temp1 <= temp2