【Scala】数组Array、列表List、集合Set、元组Tuple
1、数组
数组可以用来存储固定大小的同一个类型的元素。定义之后可以通过下标来访问元素值,下标从0开始。
下面的代码定义了一个可以存放2个元素的 字符串数组(默认情况下会自动import 长度不可变化的数组),当给下标为2的元素赋值时会报错,因为越界了:
scala> var x:Array[String] = new Array[String](2)
x: Array[String] = Array(null, null)
scala> x(0) = "scala"
scala> x(1) = "java"
scala> x(2) = "c++"
java.lang.ArrayIndexOutOfBoundsException: 2
... 32 elided
下面在定义一个长度可变的数组(需要import 或者创建时指定),可以通过 +=来赋值,而且一次可以赋值多个:
scala> var y = new scala.collection.mutable.ArrayBuffer[String]
y: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer()
scala> y += "scala"
res7: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(scala)
scala> y += ("java","c++","javascript")
res8: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(scala, java, c++, javascript)
2、列表
列表也是存放相同类型的元素,但是列表中元素的值时不可变的。
但是,另一方面由于列表有递归的结构,也就是链表结构,所以可以把多个列表合并成一个列表(列表又是可以扩展的),但是又没办法直接通过下标引用,来增加新的列表元素(会报错),可以通过:::操作符来合并多个LIst。
另外,列表最后可以加上 Nil表示列表的结尾 :
scala> var x = List("scala","java","c++")
x: List[String] = List(scala, java, c++)
scala> var y = List("php","python")
y: List[String] = List(php, python)
scala> x(0)
res15: String = scala
scala> x(0)="linux"
<console>:13: error: value update is not a member of List[String]
x(0)="linux"
^
scala> x= x:::y ::: List("linux","hadoop")
x: List[String] = List(scala, java, c++, php, python, linux, hadoop)
scala> x(7)="kafka"
<console>:13: error: value update is not a member of List[String]
x(7)="kafka"
scala> x = x ::: Nil
x: List[String] = List(scala, java, c++, php, python, linux, hadoop)
定义可变的List,通过+= 来增加列表元素,通过下标访问元素且重新赋值,也就是不仅能够动态扩展元素,而且还可以改变元素的值 :
scala> var y = scala.collection.mutable.ListBuffer("php","python")
y: scala.collection.mutable.ListBuffer[String] = ListBuffer(php, python)
scala> y(0)
res19: String = php
scala> y(1)
res20: String = python
scala> y(2)
java.lang.IndexOutOfBoundsException: 2
at scala.collection.mutable.ListBuffer.apply(ListBuffer.scala:126)
... 32 elided
^
scala> y += "Linux"
res25: scala.collection.mutable.ListBuffer[String] = ListBuffer(php, python, Linux)
scala> y(0)="php"
scala> y(0)="flume"
scala> y
res29: scala.collection.mutable.ListBuffer[String] = ListBuffer(flume, python, Linux)
3、集合
和数组、列表不同的是:
(1)Set存放的值是唯一的,如果赋值的值有重复,会自动去重.
(2)Set可以存储不同类型的值,因为在创建集合的时候,不需要指定数据类型。
集合也分为 不可变集合 和 可变集合。
集合不能通过下标访问元素,通过exists 判断某个值是否在集合中存在,通过++ 来合并集合
scala> var y = Set("php","python","php","scala")
y: scala.collection.immutable.Set[String] = Set(php, python, scala)
scala> y(0)
<console>:13: error: type mismatch;
found : Int(0)
required: String
y(0)
^
scala> y.exists(_ == "php")
res32: Boolean = true
scala> y.head
res34: String = php
scala> y.tail
res35: scala.collection.immutable.Set[String] = Set(python, scala)
scala> y.isEmpty
res36: Boolean = false
scala> y ++ Set(123)
res37: scala.collection.immutable.Set[Any] = Set(php, python, scala, 123)
定义可变Set:
scala> var y = scala.collection.mutable.Set("php","python","php","scala")
y: scala.collection.mutable.Set[String] = Set(python, php, scala)
scala> y+= "123"
res38: scala.collection.mutable.Set[String] = Set(python, 123, php, scala)
4、元组
元组也是不可变的,和集合类似,可以包含不同的元素。
支持的最大长度为22.
可以直接用括号来定义tuple,也可以用Tuple 后面加上元素个数来定义。
引用元素时 和数组不同,是加上 ._数字 , 数字从1开始而非0,通过 toString可以用逗号连接所有元素 :
scala> var y = ("php","python",123)
y: (String, String, Int) = (php,python,123)
scala> var y = Tuple3("php","python",123)
y: (String, String, Int) = (php,python,123)
scala> var y = Tuple4("php","python",123,456)
y: (String, String, Int, Int) = (php,python,123,456)
scala> y(0)
<console>:13: error: (String, String, Int, Int) does not take parameters
y(0)
^
scala> y._1
res41: String = php
scala> y._2
res42: String = python
scala> y._3
res43: Int = 123
scala> y._4
res44: Int = 456
scala> y.toString()
res45: String = (php,python,123,456)
还没有评论,来说两句吧...