[英]How to create an Ordering[T] from List[T] in Scala
假设我有以下列表
val preferences: List[T] = List(t1, t2, t3)
对于我的应用程序,将元素插入到preferences
的顺序暗示了元素被preferences
的顺序(即, Preferences[T]
最优选的元素是t1
,最不喜欢的元素是t3
,而t2
优于t3
但是不t1
。元素T
不包括在preferences
,说t4
和t5
,将比不太优选t3
但将被认为彼此相等。
是否有某种方法可以基于List[T]
的插入顺序来导出Ordering[T]
实例?
您可以使用Ordering
伴随对象上的方法实现自定义Ordering
。 例如,要按List
排序,您必须比较此列表中元素的索引:
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
}
}
如果List
很小,这应该可以很好地工作。 但是indexOf
操作使用线性时间,因此对于较大的列表,您可能需要事先将其转换为Map
:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.