scala神奇的sortBy方法

在学习scala的过程中,其中的集合确实会难倒很多人,今天就主要分享我对sortBy函数的理解


 


这是官网对sortBy函数的解释和例子,个人对此没有怎么看懂,因此自己摸索实践,慢慢总结出来自己的想法,

 


这个是在编译器里面自动出来的


首先我们看,这个sortBy[B],第一个B是指返回值,


括号里面的f:(Int)=>B代表传入一个参数,这个参数类型是Int类型,这个函数的返回值是B类型的


后面的implicit ord:Ordering[B]这个是排序的规则

 

话不多说,上代码案例

 

第一个案例是对一个整数型的list进行排序

@Test
def testInt(): Unit ={
 
var list = List(1,2,3,6,4,8,9,0)
  println(list.sortBy(sortIntRule))
}

def sortIntRule(i:Int) ={
   i
match {
    
case 1=> 2
    
case 2=> 1
    
case 3=> 4
    
case _=> 0
  
}
}

 

这个排序的规则是,传入这个函数,必须只有一个Int类型的参数,然后进行类型匹配,遇到1了按照2进行排序,遇到2了按照1进行

排序,这样真正排序下来是2再到1,遇到3了按照4开始排序,其他的都按照0排序,也就是最小的,这样的意思就是除了1,2,3的其

他数据都是按照0排序,也就是最小的,在这个LIST中应该6,4,8,9,0,然后接下来按照模式匹配后的顺序排序,也就是1,2,4,

对应list里面的2,1,3,总的排序结果就是6,4,8,9,0,2,1,3

测试结果如上图

 

第二个案例是对对象进行排序


首先我定义了一个person类,并有默认传参,这里变量为大写主要是为了不冲突

package exercise.dto

class Person(age:Int,name:String,salary:Int) {
  var AGE = age
  var NAME = name
  var SALARY = salary


  override def toString = s"Person($AGE, $NAME, $SALARY)"
}

 

然后写他的测试方法

 


@Test
def TestSortBy(): Unit = {
  val personOne = new Person(18, "zhangsan", 10000)
  val personTwoA = new Person(20, "lisiA", 9000)
  val personTwoB = new Person(20, "lisiB", 10000)
  val personThree = new Person(15, "wangwu", 8000)
  var list = new ListBuffer[Person]
  list.+=(personOne, personTwoA,personTwoB, personThree)
  println(list.sortBy(sortRule)(Ordering.Tuple2(Ordering.Int.reverse, Ordering.Int.reverse)))
}

def sortRule(person: Person): (Int, Int) = {
  (person.AGE, person.SALARY)
}

 

这里我传入的函数是sortRule,这个函数的意思是根据person对象的年龄和薪水进行排序,如果年龄出现一样的再按照薪水进行排序

 

然后后面的Ording,Tuple2(Ordering.Int.reverse,Ordering.Int.reverse)意思是有两个参数的元组,第一个Int型的按照从大到小排序,

reverse指从大到小排序,第二个也是从大到小排序,默认是从小到大的排序。

 

执行结果如上图,



希望对大家有所帮助哦

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值