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

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

  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. ExtJS4.2.1

    ExtJS4.2.1 1. 介绍 1.1 说明 ExtJS是一个用javascript.CSS和HTML等技术实现的主要用于创建RIA即富客户端,且与后台技术无关的前端Ajax框架. 常用于企业内部管 ...

  2. 单服务员排队模拟100天matlab实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang %单服务员排队模型模拟100天 clear clc day = 100 ;s = zeros(1, ...

  3. js运算符的优先级

    自上向下优先级降低 运算符 描述 . [] () 字段访问.数组下标.函数调用以及表达式分组 ++ -- - ~ ! delete new typeof void 一元运算符.返回数据类型.对象创建. ...

  4. Codeforces 276D Little Girl and Maximum XOR

    题意:给范围l,r选两个数亦或最大是多少. 思路:找到第一个l和r二进制下不相同的位置i,然后答案就是2^(i+1)-1,因为一个取0一个取1之后,后面的位置全部选1和全部选0,就是这样:011111 ...

  5. LeetCode_sqrt(x)

    class Solution { public: int sqrt(int x) { // Start typing your C/C++ solution below // DO NOT write ...

  6. 【转】64位win7硬盘安装64位ubuntu 13.04

    原文网址:http://www.cnblogs.com/jiangz/p/3751617.html 最近本来是准备通过升级的方式把ubuntu从12.04升级到12.10再升级到13.04的,但是升级 ...

  7. poj2752 Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  8. SDN,NFV

    CAPEX,capital expenditures  投资成本OPEX,Operating Expense 运营费用space & power consumption 图解NFV与SDN关系

  9. 一、mysql分表简单介绍

    一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中 ...

  10. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...