项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

scala的集合中提供了三种排序的方式:sorted,sortWith,sortBy。那么这三种方式有什么不同呢?下面我们结合源码来分析一下

1.sorted

先来看看scala中sorted的源码。

  def sorted[B >: A](implicit ord: Ordering[B]): Repr = {val len = this.lengthval arr = new ArraySeq[A](len)var i = 0for (x <- this.seq) {arr(i) = xi += 1}java.util.Arrays.sort(arr.array, ord.asInstanceOf[Ordering[Object]])val b = newBuilderb.sizeHint(len)for (x <- arr) b += xb.result}

源码中有两点值得注意的地方:
1.sorted方法中有个隐式参数ord: Ordering。
2.sorted方法真正排序的逻辑是调用的java.util.Arrays.sort。

2.sortBy

看看sortBy的源码,很简单。

  def sortBy[B](f: A => B)(implicit ord: Ordering[B]): Repr = sorted(ord on f)

sortBy最后也是调用的sorted方法。不一样的地方在于,sortBy前面还需要提供一个属性。

3.sortWith

sortWith的源码如下。

def sortWith(lt: (A, A) => Boolean): Repr = sorted(Ordering fromLessThan lt)

跟前面两个不同的是,sortWith需要传入一个比较函数用来比较!

4.实例

理论部分说完了,下面来干货

object ImplicitValue {implicit val KeyOrdering = new Ordering[String] {override def compare(x: String, y: String) : Int = {y.compareTo(x)}}
}

首先定义了一个隐式比较器。

 def test1() = {import ImplicitValue.KeyOrderingval list = List( "a", "g", "F", "B", "c")val sortedList = list.sortedprintln(sortedList) // List(g, c, a, F, B)}

注意因为我们将隐式比较器import了进来,这个时候sorted排序的规则是按照我们自定义的比较器进行比较。在我们自定义的比较器中,定义的是按字符串逆序,所以最终的输出结果为字符串按从大到小的顺序排列!

再来看看sortWith的用法。

 //忽略大小写排序def compareIngoreUpperCase(e1: String, e2: String) : Boolean = {e1.toLowerCase < e2.toLowerCase}def test2() = {val list = List( "a", "g", "F", "B", "c")val sortWithList1 = list.sortWith(_ < _) // List(B, F, a, c, g)val sortwithList2 = list.sortWith((left, right) => left < right) //List(B, F, a, c, g)val sortwithList3 = list.sortWith(compareIngoreUpperCase) // List(a, B, c, F, g)println(sortWithList1)println(sortwithList2)println(sortwithList3)}

本例中, sortWithList1与sortWithList2最终的结果是一致的,只不过写法不一样而已,都是按字符串从小到大的顺序排列。sortwithList3则是按照传入的compareIngoreUpperCase函数进行排序!

最后看看sortBy的代码

 def test3() = {val m = Map(-2 -> 5,2 -> 6,5 -> 9,1 -> 2,0 -> -16,-1 -> -4)//按key排序m.toList.sorted.foreach{case (key, value) =>println(key + ":" + value)}println//按value排序m.toList.sortBy(_._2).foreach {case (key, value) =>println(key + ":" + value)}}

最后的输出结果为:

-2:5
-1:-4
0:-16
1:2
2:6
5:90:-16
-1:-4
1:2
-2:5
2:6
5:9

scala中sorted,sortWith,sortBy用法详解相关推荐

  1. escape mysql_MySQL中ESCAPE关键字的用法详解

    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义. MySQL中,转义字符以"" ...

  2. csh for循环_shell中的for循环用法详解_linux shell

    这篇文章主要介绍了shell中的for循环用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 for 命令: for i i ...

  3. conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解

    Conv2d的简单使用 torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似,但不完全一样. 在 torch 中,Conv2d 有几个基本的参数,分别是 in_channel ...

  4. 给mysql 授权 命令_mysql中授权命令grant用法详解:

    mysql中授权命令grant用法详解: mysql中可以给你一个用户授予如select,insert,update,delete等其中的一个或者多个权限,主要使用grant命令,用法格式为: gra ...

  5. python中如何反解函数_PyTorch中反卷积的用法详解

    pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下: class torch.nn.Conv2d(in_channels, out_channels, kernel_size, str ...

  6. python search用法,Python-re中search()函数的用法详解(查找ip)

    1.首先来看一下search()和find()的区别 import re s1 = "2221155" #search 字符串第一次出现的位置 print(re.search(&q ...

  7. html中iframe标签的用法详解

    <iframe>是什么?html中iframe标签的用法详解 原创  2018-10-26 10:24:35 03690 经常进行页面布局的人对于HTML中的iframe标签一定不 ...

  8. MySQL中ESCAPE关键字的用法详解

    MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...

  9. el表达式ne什么意思_JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  10. Oracle中游标Cursor基本用法详解

    这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...

最新文章

  1. 土地档案管理系统需求分析
  2. oracle杀死进程时权限不足_当集群和数据库软件目录都被chown -R时,如何快速修复...
  3. 设置了hover伪类中有cursor:hand但是没有效果
  4. chrome调试找不到 XXXX.min.map 原因及解决办法
  5. 女孩子应该养成的好习惯
  6. POJ 3468 A Simple Problem with Integers(线段树:区间更新)
  7. float position的测试案例
  8. 海量个人信息被泄漏 央视首次曝光智能呼叫机器人
  9. java实现什么接口进行排序_使用Java中Comparator接口实现自定义排序
  10. html5泵站,基于 HTML5 WebGL 的污水处理厂泵站自控系统
  11. 在.NET开发中的单元测试工具之(2)——xUnit.Net
  12. HTML网页设计:四、超链接
  13. autojs之快捷键
  14. Google账号注册失败 无法向手机发验证码
  15. 数学之美(Beauty Of Mathematics)
  16. 【VulnHub靶场】——CFS三层靶机内网渗透实操
  17. Latex中用Bibtex来引用文献
  18. EasyUI(2):PHP+EasyUI的增、删、改操作的完整示例
  19. Add/SubtractWorkingDaystoaDate_SAP刘梦_新浪博客
  20. 什么是操作系统?操作系统的主要特性是什么?主要功能是什么?

热门文章

  1. JavaScript 数据类型检测终极解决方案
  2. 阿里云成为云原生计算基金会金牌会员
  3. 常用chrome插件常用FireFox插件
  4. [资源整理]关于前端设计的那些博客儿~
  5. Base64编码格式详解
  6. 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)
  7. 在kettle中实现数据验证和检查
  8. 重载类型转换操作符(overload conversion operator)
  9. tomcat启动时出现Error starting static Resources 错误
  10. 程序猿的道路~~(How to be a programmer?)