Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为这个Scala类提供隐式排序?_Scala - Fatal编程技术网

如何为这个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
    )
}