排序 – 如何在Scala中以字典顺序排列列表集合?
发布时间:2020-12-16 19:02:07 所属栏目:安全 来源:网络整理
导读:如果A有Ordered [A]特征,我希望能够有这样的代码 val collection: List[List[A]] = ... // construct a list of lists of Asval sorted = collection sort { _ _ } 并获得列表按字典顺序排序的内容.当然,只是因为A的特征有序[A]并不意味着List [A]具有Ordere
如果A有Ordered [A]特征,我希望能够有这样的代码
val collection: List[List[A]] = ... // construct a list of lists of As val sorted = collection sort { _ < _ } 并获得列表按字典顺序排序的内容.当然,只是因为A的特征有序[A]并不意味着List [A]具有Ordered [List [A]]的特征.然而,推测这样做的“scala方式”就是隐含的def. 假设A具有特征[A](以便上面的代码正常工作),我如何将List [A]隐式转换为Ordered [List [A]]? 我想到使用List [A]对象上的字典排序,但我想要可以适应其他排序的代码. 解决方法
启发了本·列斯的回答,我写了我自己的版本:
def sort[A : Ordering](coll: Seq[Iterable[A]]) = coll.sorted 相当于: def sort[A](coll: Seq[Iterable[A]])(implicit ordering: Ordering[A]) = coll.sorted 请注意,排序被隐式转换为Ordering [Iterable [A]]. 例子: scala> def sort[A](coll: Seq[Iterable[A]])(implicit ordering: Ordering[A]) = coll.sorted sort: [A](coll: Seq[Iterable[A]])(implicit ordering: Ordering[A])Seq[Iterable[A]] scala> val coll = List(List(1,3),List(1,2),List(0),Nil,List(2)) coll: List[List[Int]] = List(List(1,List(),List(2)) scala> sort(coll) res1: Seq[Iterable[Int]] = List(List(),List(2)) 被问及如何提供自己的比较功能;可以使用Ordering.fromLessThan: scala> sort(coll)(Ordering.fromLessThan(_ > _)) res4: Seq[Iterable[Int]] = List(List(),List(2),List(0)) Ordering.by允许您将值映射到已经有Ordering实例的另一种类型.鉴于也是元组,这对于案例类的词典比较是有用的. 举一个例子,我们定义一个Int的包装器,应用Ordering.by(_.v),其中_.v提取基础值,并显示我们获得相同的结果: scala> case class Wrap(v: Int) defined class Wrap scala> val coll2 = coll.map(_.map(Wrap(_))) coll2: List[List[Wrap]] = List(List(Wrap(1),Wrap(3)),List(Wrap(1),Wrap(2)),List(Wrap(0)),List(Wrap(2))) scala> sort(coll2)(Ordering.by(_.v)) res6: Seq[Iterable[Wrap]] = List(List(),List(Wrap(2))) 最后,让我们在具有更多成员的案例类上做同样的事情,重用元组的比较器: scala> case class MyPair(a: Int,b: Int) defined class MyPair scala> val coll3 = coll.map(_.map(MyPair(_,0))) coll3: List[List[MyPair]] = List(List(MyPair(1,0),MyPair(3,0)),List(MyPair(1,MyPair(2,List(MyPair(0,List(MyPair(2,0))) scala> sort(coll3)(Ordering.by(x => (x.a,x.b))) res7: Seq[Iterable[MyPair]] = List(List(),0))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |