假设我有以下列表
val preferences: List[T] = List(t1, t2, t3)
对于我的应用程序,元素插入preferences
的顺序意味着元素的首选顺序(即Preferences[T]
中最受欢迎的元素是t1
,最不受欢迎的是t3
,t2
优先于t3
但不是t1
。T
的元素未包含在preferences
中,例如t4
1}}和t5
不如t3
更受欢迎,但会被视为彼此相等。
是否有某种方法可以根据Ordering[T]
的广告订单来派生List[T]
个实例?
答案 0 :(得分:2)
您可以使用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)