如何从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
中的三个元素上定义了排序。这一点很好!我将相应地添加一些编辑。