排序方法sort使用方式不同而产生的不同结果,附力扣179思路
对sort的了解:
sort是数组原型上的方法,接收一个回调函数作为参数;回调函数接收两个值a,b作为参数,表示正在比较的两个数组中的数字;sort的返回值是使用正负数来表示的:
正数:a排在b后面;
负数:a排在b前面;
0:相对顺序不变,可以理解为正数(因为在回调函数中,a是数组中后面的数,b是数组中前面的数,一般使用正负数,0使用较少)
使用的方式:
直接使用:Array.sort()
这个是最简单的写法,表示将数组中的元素按照ASCLL表中字符代表的ASCLL码由小到大排序,那么这就存在一个这样的问题:1会排在99的前面,因为1的ASCLL码小于9的。
基本使用:Array.sort((a,b)=>a-b)
平时我们大多使用这个方法对数字数组进行大小排序,如标题中所示,回调函数使用箭头函数表示,返回值为a-b,这个写法的作用是将数组中的数字从小到大排序。
如果将返回值改为b-a,那么表示将数组中数字从大到小排序。
进阶使用:
方法一:按照对象属性排序
Object.sort((a,b)=>a.age-b.age),按照对象中的age属性进行升序排列,当然,也可以写成b.age-a.age,进行降序排列。
方法二:多条件排序
Object.sort((a,b)=>{
if(a.age===b.age){
return a.count-b.count
}
return a.age-b.age
})
上述代码表示按照年龄从小到大排序,年龄相同则按照成绩从小到大排序。
方法三:对数字类型字符串数组排序
这个方法也是我写这篇博客的原因,在力扣179. 最大数 - 力扣(LeetCode)中,需要将数字字符串数组排序后得到最大数字。根据这个描述得知使用sort是一个很容易理解的方法:
nums.sort((a,b)=>{
let str1=String(a)+String(b),str2=String(b)+String(a)
if(str1>str2){
return 1
}else{
return -1
}
})
代码解释:由于sort比较字符串是使用ASCLL码,且0~9在ASCLL码中也是递增的,所以在长度相同的字符串中进行比较,得到的较大值就符合题目。根据上述sort的定义,返回值如果是正数,则a排在b后面,如果是负数则a排在b前边。
举例:假设数组为[3,34],str1='334',str2='343',比较下来str2第二位大于str1,所以返回正数,a应该放在 b前面,定义中提到a是数组中靠后的数,所以a为34,b为3,所以经过排序后得到数组为[34,4]。
注意事项:
当sort的回调函数包含属性计算时,如果该计算直接影响返回值,如方法一和基本使用中那样,那么只有当属性为Number类型才可以。
如果自己写回调函数体的话一定要注意a和b表示的是[后一个元素]和[前一个元素],返回正数表示后一个元素大于前一个,所以应该是a在后,b在前,负数则相反。