加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

排序 – 如何在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)))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读