0%

《Scala编程》阅读记录——列表进阶

不适合人类阅读的学习笔记

第十六章 使用列表


  1. 列表是不可变的,也就是说列表的元素不能通过赋值改变
  2. 列表是递归的(即链表),而数组是平的
  • initlast要消耗的时间与列表的长度成正比,而headtail消耗常量级别的时间

  • indices方法返回包含了指定列表所有有效的下标,所以一般用在for表达式遍历列表时:

    1
    2
    3
    4
    val lst = new List("af","g3g","g53v")
    for( i <- lst.indices){ //这里i即是从lst的第一个有效下标开始直到最后一个下标
    ...
    }

flatten方法:接受一个列表的列表并返回单个列表

  • 例子:

    1
    2
    scala> List(List(1,2),List(3),List(),List(4,5)).flatten
    res0: List[Int] = List(1,2,3,4,5)
  • 例子:

zipunzip

  • zip操作接受两个列表,返回一个有对偶组成的列表

  • 如果两个列表的元素个数不同,那么任何没有配对上的元素将被丢弃

zipWithIndex方法

  • 例子:

    1
    2
    3
    4
    scala> val abcde = List('a','b','c','d','e')
    abcde: List[Char] = List(a,b,c,d,e)
    scala> abcde.zipWithIndex
    res0: List[(Char,Int)] = List((a,0),(b,1),(c,2),(d,3),(e,4))
  • 任何元组的列表都可以通过unzip方法转换回由列表组成的元组

显示列表

  • 下面一些例子:
    1
    2
    3
    4
    5
    6
    7
    8
    scala> abcde mkString("[", ",", "]")
    res0: String = [a,b,c,d,e]
    scala> abcde mkString ""
    res1: String = abcde
    scala> abcde.mkString
    res2: String = abcde
    scala> abcde mkString ("List(", ", ", ")")
    res3: String = List(a,b,c,d,e)

过滤列表

  • filterpartitionfindtakeWhiledropWhilespan

  • 这些过滤函数的参数都是T => Boolean类型的

  • x.takeWhile(p)返回x列表中连续满足p的最长前缀,例:nums.takeWhile(_ > 0)

  • x.dropWhile将去除列表x中连续满足p的最长前缀,例:words.dropWhile(_.startsWith("t"))

对列表前提条件的检查

  • forallexists

  • xs.forall(p),如果列表中所有元素都满足p则返回true

  • xs.exists(p),如果列表中有至少一个元素满足p则返回true


> 最后更新于2018.7.24