Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/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中的列表[T]创建排序[T]_Scala - Fatal编程技术网

如何从Scala中的列表[T]创建排序[T]

如何从Scala中的列表[T]创建排序[T],scala,Scala,假设我在下面的列表中有一个 val preferences: List[T] = List(t1, t2, t3) 对于我的应用程序,元素插入到首选项中的顺序意味着元素的优先顺序(即首选项[T]中最优先的元素)是t1,最不受欢迎的是t3,t2比t3更受欢迎,但不是t1。T中未包含在首选项中的元素,例如t4和t5,不如t3更受欢迎,但被认为彼此相等 是否有某种方法可以基于列表[T]的插入顺序派生排序[T]实例?您可以使用排序伴随对象上的方法实现自定义排序实例。例如,要按列表排序,必须比较此列表中

假设我在下面的列表中有一个

val preferences: List[T] = List(t1, t2, t3)
对于我的应用程序,元素插入到
首选项中的顺序
意味着元素的优先顺序(即
首选项[T]中最优先的元素)
t1
,最不受欢迎的是
t3
t2
t3
更受欢迎,但不是
t1
T
中未包含在
首选项中的元素,例如
t4
t5
,不如
t3
更受欢迎,但被认为彼此相等


是否有某种方法可以基于
列表[T]
的插入顺序派生
排序[T]
实例?

您可以使用
排序
伴随对象上的方法实现自定义
排序
实例。例如,要按
列表
排序,必须比较此列表中元素的索引:

def listBasedOrdering[T](list: List[T]): Ordering[T] = {
  Ordering.by[T, Int] { t =>
    val index = list.indexOf(t)
    if (index == -1) list.size else index
  }
}
如果
列表
很小,这应该足够好。但是
indexOf
操作使用线性时间,因此对于较大的列表,您可能需要事先将其转换为
映射

def listBasedOrdering[T](list: List[T]): Ordering[T] = {
  val map = list.zipWithIndex.toMap.withDefaultValue(list.size)
  Ordering.by[T, Int](map)
}
下面是一个小测试:

scala> implicit val ord = listBasedOrdering(List("t1", "t2", "t3"))
ord: Ordering[String] = scala.math.Ordering$$anon$9@95cecc5

scala> List("t5", "t3", "t2", "t1", "t0").sorted
res0: List[String] = List(t1, t2, t3, t5, t0)

好的,您不是在
T
上定义了排序,而是在
T
中的三个元素上定义了排序。这一点很好!我将相应地添加一些编辑。