美文网首页
Scala编程基础17:Scala 列表

Scala编程基础17:Scala 列表

作者: 金字塔下的小蜗牛 | 来源:发表于2020-04-08 08:16 被阅读0次

    Scala列表类似于数组,元素类型都是相同的。但是列表和数组也有不同之处:列表是不可改变的,值一旦被定义了就不能改变了;其次列表具有递归结构。列表的类型可以表示为List[T],其中T表示列表中每个元素的类型。

    1.定义列表

    下面是一些定义列表的示例:

    val site:List[String] = List("Hello","Scala","I Love Scala")
    val nums: List[Int] = List(1,2,3,4)
    val empty:List[Nothing] = List()
    val dim2:List[List[Int]] = List(List(1,2,3),List(4,5,6),List(7,8,9))

    因为列表具有递归结构,可以看成是一个元素连接上一个列表,所以构造列表也可以使用[Nil]和[::]两种符号来完成,其中Nil表示一个空列表。上述示例可以改写成如下形式:

    val site = "Hello"::("Scala"::("I Love Scala"::Nil))
    val nums = 1::(2::(3::(4::Nil)))
    val empty = Nil
    val dim2 = (1::(2::(3::Nil))::(4::(5::(6::Nil)))::(7::(8::(9::Nil)))::Nil

    2.列表基本操作

    Scala列表有三个基本操作:

    • head返回列表第一个元素
    • tail返回除第一个元素外的剩余元素的列表
    • isEmpty在列表为空时返回true

    对于Scala列表的任何操作,都可以使用这三个基本操作来表达。示例如下:

    object Test1 {
        def main(args:Array[String]){
            val myList = "Hello"::("Scala"::("I Love Scala"::Nil));
            val empty = Nil;
            println("myList head = " + myList.head);
            println("myList tail = " + myList.tail);
            println("myList isEmpty = " + myList.isEmpty);
            println("empty isEmpty = " + empty.isEmpty);
        }
    }
    

    编译并执行上述代码,输出结果如下:

    E:\Scala>scalac Test1.scala
    E:\Scala>scala Test1
    myList head = Hello
    myList tail = List(Scala, I Love Scala)
    myList isEmpty = false
    empty isEmpty = true

    3.列表连接操作

    连接多个列表可以有以下三种方法:

    • 使用运算符:::
    • 使用方法List.:::()
    • 使用方法List.concat()

    下面是列表连接的示例:

    object Test2 {
        def main(args:Array[String]){
            val myList1 = "Hello"::("Scala"::Nil);
            val myList2 = "I"::("Love"::("Scala"::Nil));
            val res1 = myList1:::myList2;
            println("myList1:::myList2 = " + res1);
            val res2 = myList1.:::(myList2);
            println("myList1.:::(myList2) = " + res2);
            val res3 = List.concat(myList1,myList2);
            println("List.concat(myList1,myList2) = " + res3);
        }
    }
    

    编译并执行上述的代码,输出结果如下:

    E:\Scala>scalac Test2.scala
    E:\Scala>scala Test2
    myList1:::myList2 = List(Hello, Scala, I, Love, Scala)
    myList1.:::(myList2) = List(I, Love, Scala, Hello, Scala)
    List.concat(myList1,myList2) = List(Hello, Scala, I, Love, Scala)

    4.列表填充

    可以使用List.fill()方法来创建一个指定重复次数的元素列表:

    object Test3 {
        def main(args:Array[String]){
            val myList1 = List.fill(3)("Scala");
            val myList2 = List.fill(5)(4);
            println("myList1 = " + myList1);
            println("myList2 = " + myList2);
        }
    }
    

    编译并执行上述代码,输出结果如下:

    E:\Scala>scalac Test3.scala
    E:\Scala>scala Test3
    myList1 = List(Scala, Scala, Scala)
    myList2 = List(4, 4, 4, 4, 4)

    5.使用函数创建列表

    使用List.tabulate()方法可以通过指定的函数来动态创建列表。该方法的第一个参数为元素的数量,可以是二维的,第二个参数为指定的函数,通过指定的函数计算结果并返回值插入到列表中,起始值为0,示例如下:

    object Test4 {
        def main(args:Array[String]){
            val squares = List.tabulate(4)(n=>n*n);
            println("squares = " + squares);
            val mul = List.tabulate(3,4)(_*_);
            println("mul = " + mul);
        }
    }
    

    编译并执行上述代码,输出结果如下:

    E:\Scala>scalac Test4.scala
    E:\Scala>scala Test4
    squares = List(0, 1, 4, 9)
    mul = List(List(0, 0, 0, 0), List(0, 1, 2, 3), List(0, 2, 4, 6))

    6.列表反转

    使用List.reverse方法可以将一个列表的顺序反转:

    object Test5 {
        def main(args:Array[String]){
            val myList = List("Hello","Scala","I Love Scala");
            println("myList = " + myList);
            println("myList.reverse = " + myList.reverse);
        }
    }
    

    编译并执行以上代码,输出结果如下:

    E:\Scala>scalac Test5.scala
    E:\Scala>scala Test5
    myList = List(Hello, Scala, I Love Scala)
    myList.reverse = List(I Love Scala, Scala, Hello)

    7.列表常用方法

    下面列出了Scala中List常用的方法:

    def +:(elem: A): List[A]
    为列表预添加元素

    scala> val x = List(1)
    x: List[Int] = List(1)

    scala> val y = 2 +: x
    y: List[Int] = List(2, 1)

    scala> println(x)
    List(1)

    def ::(x: A): List[A]
    在列表开头添加元素

    def :::(prefix: List[A]): List[A]
    在列表开头添加指定列表的元素

    def :+(elem: A): List[A]
    复制添加元素后列表。

    scala> val a = List(1)
    a: List[Int] = List(1)

    scala> val b = a :+ 2
    b: List[Int] = List(1, 2)

    scala> println(a)
    List(1)

    def addString(b: StringBuilder): StringBuilder
    将列表的所有元素添加到 StringBuilder

    def addString(b: StringBuilder, sep: String): StringBuilder
    将列表的所有元素添加到 StringBuilder,并指定分隔符

    def apply(n: Int): A
    通过列表索引获取元素

    def contains(elem: Any): Boolean
    检测列表中是否包含指定的元素

    def copyToArray(xs: Array[A], start: Int, len: Int): Unit
    将列表的元素复制到数组中。

    def distinct: List[A]
    去除列表的重复元素,并返回新列表

    def drop(n: Int): List[A]
    丢弃前n个元素,并返回新列表

    def dropRight(n: Int): List[A]
    丢弃最后n个元素,并返回新列表

    def dropWhile(p: (A) => Boolean): List[A]
    从左向右丢弃元素,直到条件p不成立

    def endsWith[B](that: Seq[B]): Boolean
    检测列表是否以指定序列结尾

    def equals(that: Any): Boolean
    判断是否相等

    def exists(p: (A) => Boolean): Boolean
    判断列表中指定条件的元素是否存在。

    例如:判断l是否存在某个元素:
    scala> l.exists(s => s == "Hah")
    res7: Boolean = true

    def filter(p: (A) => Boolean): List[A]
    输出符号指定条件的所有元素。

    例如:过滤出长度为3的元素:
    scala> l.filter(s => s.length == 3)
    res8: List[String] = List(Hah, WOW)

    def forall(p: (A) => Boolean): Boolean
    检测所有元素。

    例如:判断所有元素是否以”H”开头:
    scala> l.forall(s => s.startsWith(“H”)) res10: Boolean = false

    def foreach(f: (A) => Unit): Unit
    将函数应用到列表的所有元素

    def head: A
    获取列表的第一个元素

    def indexOf(elem: A, from: Int): Int
    从指定位置 from 开始查找元素第一次出现的位置

    def init: List[A]
    返回所有元素,除了最后一个

    def intersect(that: Seq[A]): List[A]
    计算多个集合的交集

    def isEmpty: Boolean
    检测列表是否为空

    def iterator: Iterator[A]
    创建一个新的迭代器来迭代元素

    def last: A
    返回最后一个元素

    def lastIndexOf(elem: A, end: Int): Int
    在指定的位置 end 开始查找元素最后出现的位置

    def length: Int
    返回列表长度

    def map[B](f: (A) => B): List[B]
    通过给定的方法将所有元素重新计算

    def max: A
    查找最大元素

    def min: A
    查找最小元素

    def mkString: String
    列表所有元素作为字符串显示

    def mkString(sep: String): String
    使用分隔符将列表所有元素作为字符串显示

    def reverse: List[A]
    列表反转

    def sorted[B >: A]: List[A]
    列表排序

    def startsWith[B](that: Seq[B], offset: Int): Boolean
    检测列表在指定位置是否包含指定序列

    def sum: A
    计算集合元素之和

    def tail: List[A]
    返回所有元素,除了第一个

    def take(n: Int): List[A]
    提取列表的前n个元素

    def takeRight(n: Int): List[A]
    提取列表的后n个元素

    def toArray: Array[A]
    列表转换为数组

    def toBuffer[B >: A]: Buffer[B]
    返回缓冲区,包含了列表的所有元素

    def toMap[T, U]: Map[T, U]
    List 转换为 Map

    def toSeq: Seq[A]
    List 转换为 Seq

    def toSet[B >: A]: Set[B]
    List 转换为 Set

    def toString(): String
    列表转换为字符串

    相关文章

      网友评论

          本文标题:Scala编程基础17:Scala 列表

          本文链接:https://www.haomeiwen.com/subject/weskdhtx.html