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. Numpy学习笔记<1>

    1 numpy的ndarray:一种多维数组 a:创建ndarry   注意:np.array会尝试为新建的数组一个合适的数据类型 保存在dtype中 b:嵌套序列转换为一个多维数组 c:输出数据类型 ...

  2. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  3. JavaWeb学习——获取类路径下的资源

    对于JavaWeb而言,获取类路径下的资源,就是获取classes目录下的资源. 获取资源的方式有两种,利用Class或ClassLoader. Class类的getResourceAsStream( ...

  4. 一个github搞定微信小程序支付系列

    详情请前往github下载示例代码 源码中包含 支付.退款 功能 so easy,项目经理再也不用担心微信支付啦 是的,已经over了

  5. IntelliJ IDEA 激活

    方法1 进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.php   或者   http://idea.la ...

  6. lightoj 1088【树状数组+离散化】

    题意: 给你n个数,然后给你q个区间,然后问你这n个数有多少个在这个区间上: 思路: 树状数组搞搞,但是注意到数的范围很大,所以先离散化一下. 初始化初始化!!!卧槽,wa的我好郁闷... #incl ...

  7. DirectX实现球面纹理映射

    http://www.cnblogs.com/graphics/archive/2011/09/13/2174022.html DirectX实现球面纹理映射 介绍 球面纹理映射就是将一个平面纹理映射 ...

  8. win10子系统linux编译ffmpeg

    android-ndk-r14b(linux版) ffmpeg-4.0 开启win10子系统(控制面板->程序和功能->启用或关闭Windows功能 然后在 适用与 Linux 的 Win ...

  9. tagName

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. matplotlib 学习笔记02:marker标记详解

    本文内容来自于matplotlib官网:matplotlib官网markers资料 This module contains functions to handle markers. Used by ...