Scala排序函数sortedsortBysortWith
排序⽅法在实际的应⽤场景中⾮常常见,Scala⾥⾯有三种排序⽅法,分别是: sorted,sortBy ,sortWith 分别介绍下他们的功能:
(1)sorted
对⼀个集合进⾏⾃然排序,通过传递隐式的Ordering
源码中有两点值得注意的地⽅:
1.sorted⽅法中有个隐式参数ord: Ordering。
2.sorted⽅法真正排序的逻辑是调⽤的java.util.Arrays.sort。
def sorted[B>:A](implicit ord: Ordering[B]): Repr ={
val len =this.length
val arr =new ArraySeq[A](len)
var i =0
for(x <-this.q){
coaster
arr(i)= x
i +=1
}
java.util.Arrays.sort(arr.array, ord.asInstanceOf[Ordering[Object]])
val b = newBuilder
b.sizeHint(len)
for(x <- arr) b += x
socrates
}
(2)sortBy
对⼀个属性或多个属性进⾏排序,通过它的类型。
sortBy最后也是调⽤的sorted⽅法。不⼀样的地⽅在于,sortBy前⾯还需要提供⼀个属性。
def sortBy[B](f:A=>B)(implicit ord: Ordering[B]): Repr =sorted(ord on f)
invent(3)sortWith
基于函数的排序,通过⼀个comparator函数,实现⾃定义排序的逻辑。
def sortWith(lt:(A,A)=> Boolean): Repr =sorted(Ordering fromLessThan lt)
例⼦⼀:基于单集合单字段的排序
val xs=Seq(1,5,3,4,6,2)
println("==============sorted排序=================")
println(xs.sorted) //升序
println(ver) //降序
println("==============sortBy排序=================")
成都翻译公司
println( xs.sortBy(d=>d)) //升序
println( xs.sortBy(d=>d).rever ) //降序
println("==============sortWith排序=================")
println( xs.sortWith(_<_))//升序
println( xs.sortWith(_>_))//降序
结果:
==============sorted排序=================
山姆 沃尔顿List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)
==============sortBy排序=================
List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)
==============sortWith排序=================
List(1, 2, 3, 4, 5, 6)
List(6, 5, 4, 3, 2, 1)
例⼦⼆:基于元组多字段的排序
注意多字段的排序,使⽤sorted⽐较⿇烦,这⾥给出使⽤sortBy和sortWith的例⼦
先看基于sortBy的实现:
val pairs = Array(
("a", 5, 1),
("c", 3, 1),
("b", 1, 3)
英语四六级成绩)
//按第三个字段升序,第⼀个字段降序,注意,排序的字段必须和后⾯的tuple对应
val bx= pairs.
sortBy(r =>(r._3, r._1))( Ordering.Tuple2(Ordering.Int, ver))
//打印结果
bx.map( println )
结果:
(c,3,1)
(a,5,1)
(b,1,3)
再看基于sortWith的实现:
val pairs = Array(
("a", 5, 1),
("c", 3, 1),
("b", 1, 3)
)
val b= pairs.sortWith{
ca(a,b)=>{
if(a._3==b._3){//如果第三个字段相等,就按第⼀个字段降序非行
a._1>
b._1
}el{
a._3<
b._3 //否则第三个字段降序
}
}
}
//打印结果
b.map(println)
从上⾯可以看出,基于sortBy的第⼆种实现⽐较优雅,语义⽐较清晰,第三种灵活性更强,但代码稍加繁琐例⼦三:基于类的排序
先看sortBy的实现⽅法 排序规则:先按年龄排序,如果⼀样,就按照名称降序排
ca class Person(val name:String,val age:Int)
val p1=Person("cat",23)
val p2=Person("dog",23)
val p3=Person("andy",25)
val pairs = Array(p1,p2,p3)
//先按年龄排序,如果⼀样,就按照名称降序排
val bx= pairs.sortBy(person =>(person.age, person.name))( Ordering.Tuple2(Ordering.Int, ver))
电话机的英文bx.map(
println
)
结果:
Person(dog,23)
Person(cat,23)
Person(andy,25)
再看sortWith的实现⽅法:
ca class Person(val name:String,val age:Int)
val p1=Person("cat",23)
beat it什么意思val p2=Person("dog",23)
val p3=Person("andy",25)
val pairs = Array(p1,p2,p3)
val b=pairs.sortWith{
ca(person1,person2)=>{
person1.age==person2.age match {
ca true=> person1.name>person2.name //年龄⼀样,按名字降序排
ca fal=>person1.age<person2.age //否则按年龄升序排
}
}
}
i eb.map(
println
)
结果:
Person(dog,23)
Person(cat,23)
Person(andy,25)
总结:
本篇介绍了scala⾥⾯的三种排序函数,都有其各⾃的应⽤场景:
sorted:适合单集合的升降序
sortBy:适合对单个或多个属性的排序,代码量⽐较少,推荐使⽤这种
sortWith:适合定制化场景⽐较⾼的排序规则,⽐较灵活,也能⽀持单个或多个属性的排序,但代码量稍多,内部实际是通过java⾥⾯的Comparator接⼝来完成排序的。