注:列表是不可变的,不能通过赋值改变列表的元素

  列表具有递归结构,数组是连续的

  scala里的列表类型是协变的  --> scala中的逆变与协变

分治原则

  //自定义实现:::操作符
def append[T](xs:List[T],ys:List[T]):List[T]={
xs match{
case List() => ys;
case x::xs1 => x::append[T](xs1,ys);
}
}
  //自定义实现reverse函数
def rev[T](xs:List[T]):List[T]={
xs match{
case List() => xs
case x::xs1 => rev[T](xs1):::List(x)
}
}

前缀与后缀:drop、take、splitAt

xs take  n 返回列表前n个元素

xs drop n 返回列表除了前n个元素之外的所有元素

xs splitAt n 在指定位置拆分列表

元素选择

在list中不常使用随机元素访问,因为xs(n)花费的时间与索引值n成正比。

显示列表

toString方法、mkString方法

转换列表

elements、toArray、copyToArray

val arr = abced.toArray //arr为数组

arr.toString

arr.toList  //数组转换为列表

List类的高阶方法

  1.列表间映射 map, flatMap, foreach

li map fun:以类型为List[T]的列表xs和类型为T=>u的函数为操作元,返回把函数fun应用在li的每个元素之后由此组成的新列表

val l1 =List(1,2,3)map(_+1)        //List(1,2,3)map(x=>x+1)

结果:res0: List[Int] = List(2, 3, 4)

val words = List("the","quick","brown","fox");
println(words.map(_.length))

结果:List(3, 5, 5, 3)

flatMap操作符与map类似,不过它的右操作符能够返回元素列表的函数,对列表每个元素调用该方法,然后连接所有方法的结果并返回

val words = List("the","quick","brown","fox");
println(words.map(_.toList))
println(words.flatMap(_.toList))

结果:  List(List(t, h, e), List(q, u, i, c, k), List(b, r, o, w, n), List(f, o, x))
     List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x)

foreach 右操作元是过程(返回类型是Unit的函数),只对每个列表元素都调用一遍过程,操作结果仍然是Unit,不产生结果列表

var sum:int=0
List.range(1,5).foreach(x=>sum=sum+x)

结果:没有返回值,但是sum=10

   2.列表过滤

filter,partition, find, takeWhile, dropWhile, span

filter:返回列表中符合论断函数为true的所有元素组成的列表

 List(1,2,3,4,5) filter(_%2==0)

结果:res0: List[Int] = List(2, 4)

partirion:返回列表中符合论断函数为false的所有元素组成的列表

find:返回列表中第一个符合论断函数为true的元素,返回为可选值

List(1,2,3,4,5)find(_%2==0)

结果:res0: Option[Int] = Some(2)

takeWhile,dropWhile:mylist takeWhile p 返回列表mylist中最长能够满足p的前缀,dropWhile移除mylist中能够满足p的前缀

span:作用相当于组合了takeWhile和dropWhile,返回一对列表。(和splitAt组合了take和drop一样)

List(1,2,3,4,-5,6,7) takeWhile(_>0)    //结果:res1: List[Int] = List(1, 2, 3, 4)

List(1,2,3,4,-5,6,7) dropWhile(_>0)    //结果:res2: List[Int] = List(-5, 6, 7)

List(1,2,3,4,-5,6,7) span (_>0)       //结果:res3: (List[Int], List[Int]) = (List(1, 2, 3, 4),List(-5, 6, 7))

  3.列表的论断:forall,exists

操作mylist forall p,如果列表的所有元素满足p,返回true

操作mylist exists p,如果列表中存在一个元素满足p,返回true

  4.折叠列表 /:和:\

左折叠操作(z /: li)(op)  与三个对象有关 开始值z,列表li,以及二元操作op,折叠结果是op应用到前缀z以及每个相邻元素上

操作op必须以类型A和B的值为参数,并且返回类型为B的结果。  (z的类型为B,li的类型为A)

val z =1
val a =(z/:List(1,2,3)) (_+_) //相当于+(+(+(z,1),2),3) (z/:List(a,b,c)) (op) 等价于 op( op( op(z,a), b ), c )

结果a: Int = 7

右边折叠操作(List(a,b,c) :\z)(op) 等价于op(a , op(b , op(c , z ) ) )

  5.列表排序sort

List(1,-4,5,9,6,8).sort(_<_)

words.sort(_.length>_.length)

List对象的方法

前面是List类的方法,因为是在类的对象上对这些方法进行调用

有些方法是定义在List类的伴生对象中的,其中一些是创建列表的工厂方法,一些是对特定类型列表的操作

  1.通过元素创建列表:List.apply

List(1,2,3) 等价于List.apply(1,2,3)

  2.创建数值范围

var li = List.range(1,5)    // li =List(1,2,3,4) 尾部数值不在范围内
var li2 = List.range(1,9,2)  //li2 =List(1,3,5,7,9) step数值作为第三参数
var li3 = List.range(9,1,-3)  //li3 =List(9,6,3)

  3.创建统一的列表 make

var li = List.make(3,"hello")  // li = List(hello,hello,hello)

  4.解除啮合列表 List.unzip

例子:

val li1 = List("a","b","c","d")
val li2 = List(1,2,3,4,5,6)
val s = li1.zip(li2)  //zip把两个列表组合成对偶列表
println(s)       //输出List((a,1), (b,2), (c,3), (d,4))
val (s1,s2) = List.unzip(s)  //把对偶列表还原为两个列表 也可以用s.unzip,若s列表的元素不是列表,就不行。
println(s1)       //输出List(a, b, c, d)
println(s2)       //输出List(1, 2, 3, 4)

  5.连接列表 List.flatten List.concat

flatten方法以列表内的列表作为参数,并且把所有的元素列表连接在一起。

concat方法连接多个元素列表,数目不限

var xss = List(List("a","b"),List("y","z"))
println(xss.flatten)      //List(a, b, y, z)
println(List.concat(l1,l3))  //List(1, 2, 3, 4, 111, 52)

6.映射及测试配对列表 List.map2 List.forall2 List.exists2

scala2.11.4没有发现,近似功能函数待补充

Scala学习文档-列表的使用的更多相关文章

  1. Scala学习文档-样本类与模式匹配(match,case,Option)

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定. //样本类case class //层级包括一个抽象基类Expr和四个子类,每个代表一种表 ...

  2. Scala学习文档-访问修饰符

    在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...

  3. Scala学习文档-各种使用模式的情况

    模式在变量定义中 在定义val或者var的时候,可以使用模式替代简单的标识符,如可以使用模式拆分元组,并把每个值分配给变量 val myTuple = (123,"abc") va ...

  4. Sharepoint学习笔记—ECM系列—文档列表的Metedata Navigation与Key Filter功能的实现

    如果一个文档列表中存放了成百上千的文档,想要快速的找到你想要的还真不是件容易的事,Sharepoint提供了Metedata Navigation与Key Filter功能可以帮助我们快速的过滤和定位 ...

  5. Learning to rank的讲解,单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)

    学习排序(Learning to Rank) LTR(Learning torank)学习排序是一种监督学习(SupervisedLearning)的排序方法.LTR已经被广泛应用到文本挖掘的很多领域 ...

  6. dedecms后台每页文章条数如何修改(“文档列表”每一页显示的文档条数)

    小明在学习采集,弄了个dedecms作为发布平台,几个小时后跑来报喜说好简单,但又不想制造那么多spam,每个分类只保留几条就好.在后台删除这些文章,每页只显示30个,看了下有100多页,立马沮丧了, ...

  7. Ext JS 6学习文档-第6章-高级组件

    Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...

  8. Ext JS 6学习文档-第5章-表格组件(grid)

    Ext JS 6学习文档-第5章-表格组件(grid) 使用 Grid 本章将探索 Ext JS 的高级组件 grid .还将使用它帮助读者建立一个功能齐全的公司目录.本章介绍下列几点主题: 基本的 ...

  9. Ext JS 6学习文档-第4章-数据包

    Ext JS 6学习文档-第4章-数据包 数据包 本章探索 Ext JS 中处理数据可用的工具以及服务器和客户端之间的通信.在本章结束时将写一个调用 RESTful 服务的例子.下面是本章的内容: 模 ...

随机推荐

  1. UILabel自适应高度和自动换行

    码: //初始化label UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,0,0)]; //设置自动行数与字符换行 [l ...

  2. Mysql 新建用户以及授权远程连接操作

    1:以root身份登陆mysql终端 mysql -uroot -pmysql 2:创建wx用户,注意密码要加单引号 mysql> create user wx identified by 'w ...

  3. Codeforces 478D Red-Green Towers

    http://codeforces.com/problemset/problem/478/D 思路:dp:f[i][j]代表当前第i层,用了j个绿色方块的方案数,用滚动数组,还有,数组清零的时候一定要 ...

  4. emacs vim IDE

    原本想花点时间来学习下Vim或者emacs,结果在网上搜索到这篇文章 骂战挺多的,但是也长见识 http://bbs.csdn.net/topics/390306165 下面是windows下的ema ...

  5. python 操作 office

    首先介绍下office win32 com接口,这个是MS为自动化提供的操作接口,比如我们打开一个WORD文档,就可以在里面编辑VB脚本,实现我们自己的效果.对于这种一本万利的买卖,Python怎么能 ...

  6. Delphi流的操作 转

    一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流 ...

  7. 一起talk C栗子吧(第二十回:C语言实例--括号匹配)

    各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...

  8. Mysql存储引擎概念特点介绍及不同业务场景选用依据

    目录 MySQL引擎概述 1 MySAM引擎介绍 2 什么是InnoDB引擎? 3 生产环境中如何批量更改MySQL引擎 4 有关MySQL引擎常见企业面试题 MySQL引擎概述 Mysql表存储结构 ...

  9. extjs folder is lost解决方法 和 FineUI主题切换时 iframe内的内容主题不变的解决方法

    错误原因:extjs包和FineUI版本不一致 或者是 webconfig配置中 没有设置为任何人可访问  解放方法下载和FineUI版本相同的extjs包就ok了 解决方法:FineUI主题切换时 ...

  10. FpSpread添加表头(列名)标注

    for (int j = 0; j < fp.ActiveSheetView.ColumnCount; j++) { fp.ActiveSheetView.ColumnHeader.Cells[ ...