如何为这个Scala类提供隐式排序?
到目前为止,我的课上没有多少内容,但我希望能够对如何为这个Scala类提供隐式排序?,scala,Scala,到目前为止,我的课上没有多少内容,但我希望能够对arr进行排序。有没有办法将arrayOfNums设置为arr.sorted?我不知道如何告诉Scala将一个点(x,y)视为一个元组,基本上,它已经隐含了排序 我的第二个问题是:如果我有一个散点图的数组缓冲区,我怎么能同时给出隐含的排序顺序呢?点在任何意义上编译器都不会识别“隐含排序”。不过,提供一个很容易: case class Point(x:Int, y:Int) class Scatterplot(arr: ArrayBuffer[
arr
进行排序。有没有办法将arrayOfNums
设置为arr.sorted
?我不知道如何告诉Scala将一个点(x,y)
视为一个元组,基本上,它已经隐含了排序
我的第二个问题是:如果我有一个散点图的数组缓冲区,我怎么能同时给出隐含的排序顺序呢?
点
在任何意义上编译器都不会识别“隐含排序”。不过,提供一个很容易:
case class Point(x:Int, y:Int)
class Scatterplot(arr: ArrayBuffer[Point]){
val arrayOfNums = arr.sorted //no implicit ordering defined!
}
这提供了字典排序,表示您希望将点映射到(Int,Int)
(它确实有一个排序实例)并比较这些点。如果您想要另一个排序,可以适当地调整实现
请注意,将点
的排序实例放在点
的伴生对象中,可以确保即使未将点排序
显式导入范围,该实例也可用
回答您的后续问题:一旦您对点
进行了排序,就可以对散点图
使用类似的代码:
case class Point(x: Int, y: Int)
object Point {
implicit val pointOrdering: Ordering[Point] = Ordering.by {
case Point(x, y) => (x, y)
}
}
不过,对可变集合进行排序比对可变集合进行排序更糟糕。谢谢。但我不太清楚您所说的最后一部分是什么意思(即使我没有明确地将其导入范围,可用性又是什么意思?)。您知道如何在第二个问题上应用排序吗?更新为回答第二个问题。第一个是关于隐式解析的细节,这可能需要一个单独的问题。简短的回答是,将这些基本类型类实例放在伴随对象中是一种最佳实践。与直接将它们放在case类或类似的对象中相比,“对可变集合排序比对可变集合排序更糟糕。”什么?回答不错,但我会先按距离(0,0)排序,然后按x和y排序。
import scala.collection.mutable.ArrayBuffer
class Scatterplot(arr: ArrayBuffer[Point]){
val arrayOfNums = arr.sorted
}
object Scatterplot {
implicit val scatterplotOrdering: Ordering[Scatterplot] =
Ordering.Implicits.seqDerivedOrdering[ArrayBuffer, Point].on[Scatterplot](
_.arrayOfNums
)
}