如何在Scala中从List [T]创建Ordering [T]

时间:2018-05-15 07:20:03

标签: scala

假设我有以下列表

val preferences: List[T] = List(t1, t2, t3)

对于我的应用程序,元素插入preferences的顺序意味着元素的首选顺序(即Preferences[T]中最受欢迎的元素是t1,最不受欢迎的是t3t2优先于t3但不是t1T的元素未包含在preferences中,例如t4 1}}和t5不如t3更受欢迎,但会被视为彼此相等。

是否有某种方法可以根据Ordering[T]的广告订单来派生List[T]个实例?

1 个答案:

答案 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)