繁体   English   中英

如何在Scala中从列表[T]创建订购[T]

[英]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 ,说t4t5 ,将比不太优选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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM