sort
sorted:适合单集合的升降序
sortBy:适合对单个或多个属性的排序,代码量比较少,推荐使用这种
sortWith:适合定制化场景比较高的排序规则,比较灵活,也能支持单个或多个属性的排序,但代码量稍多,内部实际是通过java里面的Comparator接口来完成排序的。
package spark2021 import breeze.linalg.reverse object Sort_Test2 { def main(args:Array[String]):Unit={ //基于单集合单字段的排序 val list = List(1,5,3,2,4) //sort排序:默认升序 println(list.sorted) println(list.sorted,reverse) //sortBy println(list.sortBy(x=>x)) println(list.sortBy(x=>x).reverse) //sortWith println(list.sortWith((x1,x2)=>x1<x2)) println(list.sortWith(_<_)) println(list.sortWith(_<_).reverse) } }
package spark2021 import breeze.linalg.reverse object Sort_Test3 { def main(args:Array[String]):Unit={ //基于元组多字段的排序 //按第三个字段升序,第一个字段降序 val array = Array(("a",5,1),("c",3,1),("b",1,3)) //sortBy val array_sortBy = array.sortBy(r=>(r._3,r._1))(Ordering.Tuple2(Ordering.Int,Ordering.String.reverse)) array_sortBy.map(println) //sortWith val array_sortWith = array.sortWith({ case(x1,x2)=>{ if (x1._3==x2._3){ x1._1>x2._1 }else{ x1._3<x2._3 } } }) array_sortWith.map(println) } }
package spark2021 object Sort_Test4 { def main(args:Array[String]):Unit={ //基于类的排序 //先按年龄排序,如果一样,就按照名称降序排 val p1 = Person("cat",23) val p2 = Person("dog",21) val p3 = Person("duck",13) val array = Array(p1,p2,p3) //sortBy val array_sortBy = array.sortBy(person=>(person.age,person.name))(Ordering.Tuple2(Ordering.Int,Ordering.String.reverse)) array_sortBy.map(println) //sortWith val array_sortWith = array.sortWith({ case(person1,person2)=>{ if(person1.age==person2.age){ person1.name>person2.name }else{ person1.age<person2.age } } }) array_sortWith.map(println) } } case class Person(val name:String,val age:Int)
package spark2021 object ImplicitValue { implicit val KeyOrdering = new Ordering[String] { override def compare(x: String, y: String) : Int = { y.compareTo(x) } } }
package spark2021 object Sort_Test { def main(args:Array[String]):Unit={ val list = List( "a", "g", "f", "b", "c") //隐式比较器,按字符串逆序 import ImplicitValue.KeyOrdering val sortedList = list.sorted println(sortedList) // List(g, c, a, F, B) //sortWith:sortWith需要传入一个比较函数用来比较! val sortwithList2 = list.sortWith((left, right) => left < right) //List(B, F, a, c, g) val sortWithList1 = list.sortWith(_ < _) // List(B, F, a, c, g) val sortwithList3 = list.sortWith(compareIngoreUpperCase) // List(a, B, c, F, g) println(sortWithList1) println(sortwithList2) println(sortwithList3) //sortBy:sortBy需要提供一个属性 } def compareIngoreUpperCase(e1: String, e2: String) : Boolean = { e1.toLowerCase < e2.toLowerCase } }
posted on 2021-01-04 15:02 happygril3 阅读(182) 评论(0) 收藏 举报
浙公网安备 33010602011771号