9.1 使用列表

  列表类型:跟数组一样,列表也是同质化的(homogeneous)。即所有元素都要是同种类型。

  列表结构:所有列表由两部分组成:Nil 和 ::(cons)。

  基本操作:主要有三个:head , tail , isEmpty 。这些都定义在List Object里。head 和 tail只能用在非空列表里。可以用“插入排序”的例子来进行说明。

  模式匹配:::在Scala标准库里是一个case class 。所以可以使用用模式匹配

9.2 List类的定义

  List是一个抽象类。List里定义了很多方法,解释如下:

  分解列表

  啮合(zipping lists):把两个List结合成一个列表对,如,有列表:xs = List(X1 , ... Xn) 和 ys = List(y1 , ... , yn) , xs zip ys,则生成List对:List((X1 , Y1), ... (Xn , Yn))

  操作列表:跟其他中缀操作符一样,::实现为一个对象的方法。Scala里以“:”结尾的操作符都被当成右操作符,也就是从右往左运算。

  连接列表:“:::”操作符可以用来连接两个列表。

  反转列表:另一个有用的操作就是反转(reversal)。给出了一种reverse方法的实现,但是这种方法跟List的长度成正比,不是很有效。之后会给出一种只有线性关系的实现。

def reverse[A](xs : List[A]) : List[A] = xs match{
case Nil => Nil
case x :: xs => reverse(xs) ::: List(x)
}

9.3 例子:归并排序(merge sort)

  之前的插入排序(insertion sort)虽然简单,但不是很有效。平均复杂度与输入列表的长度的平方成正比。一个比插入排序更好的算法是“归并排序”。工作原理如下:

  一,如果这个List有0个或者1个元素,那么它是已经排好的,可以直接返回这个列表。稍长的列表可以分成两部分,每部分包含大概原List一半的长度内容。每个子列表被一个递归的排序调用进行排序,然后两个排序好的列表被一个合并操作合并在一起。

  对于一个归并排序的实现,我们仍然要指定元素类型,同时也要有用来做比较(comparison)的函数,用来确定排序规则。一个实现如下:

 
  def msort[A](less: (A, A) => Boolean)(xs: List[A]): List[A] = {

    def merge(xs1: List[A], xs2: List[A]): List[A] =
if (xs1.isEmpty) xs2
else if (xs2.isEmpty) xs1
else if (less(xs1.head, xs2.head)) xs1.head :: merge(xs1.tail, xs2)
else xs2.head :: merge(xs1, xs2.tail) val n = xs.length / 2
if (n == 0) xs
else merge(msort(less)(xs.take(n)), msort(less)(xs.drop(n))) }

msort的定义用到了柯里化,所以可以这样使用:

val intSort = msort((x : Int , y : Int) => x < y)
val reverseSort = msort((x : Int , y : Int) => x > y
val list=List(1 to 20 by 2:_*)
val list1=list++List(21,22)
println("list1="+list1)
val list2=22+:21+:list
println("list2="+list2)
val list3=list--List(19,20)
println("list3="+list3)
val list4=list-19-20
println("list4="+list4)
val list5=list:::List(21,22)
println("list5="+list5)
val list6=22::21::list
println("list6="+list6)
val list7=list.break(_>10)
println("list7="+list7)
val list8=list.companion(4,5)
println("list8="+list8)
val list9=list.drop(5)
println("list9="+list9)
val list10=list.dropWhile(_<10)
println("list10="+list10)
val list11=List("a","b").mapConserve(_.toUpperCase())
println("list11="+list11)
val list12=list.remove(_%5==0)
println("list12="+list12)
val list13=(15::list).removeDuplicates
println("list13="+list13)
val list14=list.reverse
println("list14="+list14)
val list15=list.slice(2,6)
println("list15="+list15)
 
 
结果
 
list1=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)
list2=List(22, 21, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
list3=List(1, 3, 5, 7, 9, 11, 13, 15, 17)
list4=List(1, 3, 5, 7, 9, 11, 13, 15, 17)
list5=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)
list6=List(22, 21, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
list7=(List(1, 3, 5, 7, 9),List(11, 13, 15, 17, 19))
list8=List(4, 5)
list9=List(11, 13, 15, 17, 19)
list10=List(11, 13, 15, 17, 19)
list11=List(A, B)
list12=List(1, 3, 7, 9, 11, 13, 17, 19)
list13=List(15, 1, 3, 5, 7, 9, 11, 13, 17, 19)
list14=List(19, 17, 15, 13, 11, 9, 7, 5, 3, 1)
list15=List(5, 7, 9, 11)
 
 
 
 
代码
 
val list16=list.sort((x,y)=>x>y)
println("list16="+list16)
val list17=list.span(_<10)
println("list17="+list17)
val list18=list.splitAt(8)
println("list18="+list18)
val list19=list.stringPrefix
println("list19="+list19)
val list20=list.take(5)
println("list20="+list20)
val list21=list.takeRight(5)
println("list21="+list21)
val list22=list.takeWhile(_<15)
println("list22="+list22)
val list23=list.toList
println("list23="+list23)
val list24=list.toStream
println("list24="+list24)
val list25=list++:List(21,22)
println("list25="+list25)
val list26=list./:(0)((x,y)=>x+y)
println("list26="+list26)
val list27=list./:\(0)((x,y)=>x+y)
println("list27="+list27)
val list28=list.:\(0)((x,y)=>x+y)
println("list28="+list28)
val list29=list.:\(0)((x,y)=>x+y)
println("list29="+list29)
val list30=list:+20:+21
println("list30="+list30)
 
 
结果
 
list16=List(19, 17, 15, 13, 11, 9, 7, 5, 3, 1)
list17=(List(1, 3, 5, 7, 9),List(11, 13, 15, 17, 19))
list18=(List(1, 3, 5, 7, 9, 11, 13, 15),List(17, 19))
list19=List
list20=List(1, 3, 5, 7, 9)
list21=List(11, 13, 15, 17, 19)
list22=List(1, 3, 5, 7, 9, 11, 13)
list23=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
list24=Stream(1, ?)
list25=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 22)
list26=100
list27=100
list28=100
list29=100
list30=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 20, 21)
 
 
代码3
val list31=list.addString(new StringBuilder("a"))
println("list31="+list31)
val list32=list.apply(5)
println("list32="+list32)
val list33=list.canEqual("")
println("list33="+list33)
val list34=list.collect{case i:Int => i+"b"}
println("list34="+list34)
val list35=list.andThen(_<10).isDefinedAt(10)
println("list35="+list35)
val list36=list.collectFirst{case i:Int => i+"b"}
println("list36="+list36)
val list37=list.take(3).combinations(2).toList
println("list37="+list37)
val list38=list.compose(list.reverse)
println("list38="+list38)
val list39=list.contains(9)
println("list39="+list39)
val list40=list.containsSlice(List(1,3))
println("list40="+list40)
val array=new Array[Int](10)
list.copyToArray(array)
println("array="+array.mkString(","))
list.copyToArray(array,5)
println("array="+array.mkString(","))
list.copyToArray(array,1,3)
println("array="+array.mkString(","))
val buff=new ListBuffer[Int]();
list.copyToBuffer(buff)
println("buff="+buff)
val list41=list.corresponds(list)(_>=_)
println("list41="+list41)
val list42=list.count(_<15)
println("list42="+list42)
val list43=list.diff(List(1,5,11))
println("list43="+list43)
val list44=list.distinct
println("list44="+list44)
val list45=list.dropRight(3)
println("list45="+list45)
 
 
结果3
 
list31=a135791113151719
list32=11
list33=true
list34=List(1b, 3b, 5b, 7b, 9b, 11b, 13b, 15b, 17b, 19b)
list35=false
list36=Some(1b)
list37=List(List(1, 3), List(1, 5), List(3, 5))
list38=<function1>
list39=true
list40=true
array=1,3,5,7,9,11,13,15,17,19
array=1,3,5,7,9,1,3,5,7,9
array=1,1,3,5,9,1,3,5,7,9
buff=ListBuffer(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
list41=true
list42=7
list43=List(3, 7, 9, 13, 15, 17, 19)
list44=List(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
list45=List(1, 3, 5, 7, 9, 11, 13)
 

Scala 的list的更多相关文章

  1. jdb调试scala代码的简单介绍

    在linux调试C/C++的代码需要通过gdb,调试java代码呢?那就需要用到jdb工具了.关于jdb的用法在网上大家都可以找到相应的文章,但是对scala进行调试的就比较少了.其实调试的大致流程都 ...

  2. scala练习题1 基础知识

    1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等:     2,在scala REPL中,计算3的平方根,然 ...

  3. 牛顿法求平方根 scala

    你任说1个整数x,我任猜它的平方根为y,如果不对或精度不够准确,那我令y = (y+x/y)/2.如此循环反复下去,y就会无限逼近x的平方根.scala代码牛顿智商太高了println( sqr(10 ...

  4. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  5. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  6. Scala快速概览

    IDEA工具安装及scala基本操作 目录 一. 1. 2. 3. 4. 二. 1. 2. 3. 三. 1. 2. 3. 4. 5. 6. 7. 四. 1. (1) (2) (3) (4) (5) ( ...

  7. Scala Macros - scalamela 1.x,inline-meta annotations

    在上期讨论中我们介绍了Scala Macros,它可以说是工具库编程人员不可或缺的编程手段,可以实现编译器在编译源代码时对源代码进行的修改.扩展和替换,如此可以对用户屏蔽工具库复杂的内部细节,使他们可 ...

  8. Scala Macros - 元编程 Metaprogramming with Def Macros

    Scala Macros对scala函数库编程人员来说是一项不可或缺的编程工具,可以通过它来解决一些用普通编程或者类层次编程(type level programming)都无法解决的问题,这是因为S ...

  9. Scala Reflection - Mirrors,ClassTag,TypeTag and WeakTypeTag

    反射reflection是程序对自身的检查.验证甚至代码修改功能.反射可以通过它的Reify功能来实时自动构建生成静态的Scala实例如:类(class).方法(method).表达式(express ...

  10. Scala For Java的一些参考

          变量 String yourPast = "Good Java Programmer"; val yourPast : String = "Good Java ...

随机推荐

  1. Codeforces325 D【并查集维护连通性】

    参考:大牛blog 思路: 因为是环,所以可以复制一下图,先判断一下和他是不是和与他相邻的8个之一的一个障碍使得构成了一个环,环就是一个连通,用并查集维护即可: 如果没有就ans++,然后并把这个点加 ...

  2. ajax 的三种使用方法

    第一种 也是最古老的一种方法之一 from 表单直接提交数据到php文件里 action为路径 <form method="post" action="./inde ...

  3. Unity3d与3dmax模型比例问题

    1 把3dmax中1米的物体,在unity中为1厘米,所以unity中需要放大100倍才能跟3dmax中效果相同 2 unity中调整模型->inspector-scale factor可以调整 ...

  4. moiezen(2018.10.16)

    题意:有n件行李,编号为1~n.行李的质量是模 P 意义下的(P不一定是质数).有 k 个背包,要装下这些行李,为了方便在背包中找行李,每个背包中的行李编号是连续的,允许有背包为空.我们想让最重的背包 ...

  5. Csc”任务不支持“SharedCompilationId”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性

    今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...

  6. 2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略

    度度熊的王国战略 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度 ...

  7. SpringMVC-高级参数绑定

    绑定数组 需求 在商品列表页面选中多个商品,然后删除. 需求分析 此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品 ...

  8. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  9. 物体检测丨Faster R-CNN详解

    这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...

  10. Linux sftp用法

    sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性.下边就简单介绍一下如何远程连接主机,进行文件的上传和下载 ...