Scala List(列表)
Scala 集合
Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是。。
列表的元素类型 T 可以写成 List[T]。例如,以下列出了多种类型的列表:
// 字符串列表
val
site
:
List
[
String
]
=
List
(
"Runoob"
,
"Google"
,
"Baidu"
)
// 整型列表
val
nums
:
List
[
Int
]
=
List
(
1
,
2
,
3
,
4
)
// 空列表
val
empty
:
List
[
Nothing
]
=
List
(
)
// 二维列表
val
dim
:
List
[
List
[
Int
]
]
=
List
(
List
(
1
,
0
,
0
)
,
List
(
0
,
1
,
0
)
,
List
(
0
,
0
,
1
)
构造列表的两个基本单位是
Nil
和
::
Nil
也可以表示为一个空列表。
以上实例我们可以写成如下所示:
// 字符串列表
val
site
=
"Runoob"
::
(
"Google"
::
(
"Baidu"
::
Nil
)
)
// 整型列表
val
nums
=
1
::
(
2
::
(
3
::
(
4
::
Nil
)
)
)
// 空列表
val
empty
=
Nil
// 二维列表
val
dim
=
(
1
::
(
0
::
(
0
::
Nil
)
)
)
::
(
0
::
(
1
::
(
0
::
Nil
)
)
)
::
(
0
::
(
0
::
(
1
::
Nil
)
)
)
::
Nil
列表基本操作
Scala列表有三个基本操作:
head
返回列表第一个元素
tail
返回一个列表,包含除了第一元素之外的其他元素
isEmpty
在列表为空时返回true
对于Scala列表的任何操作都可以使用这三个基本操作来表达。实例如下:
// 字符串列表
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site
=
"Runoob"
::
(
"Google"
::
(
"Baidu"
::
Nil
)
)
val
nums
=
Nil
println
(
"第一网站是 : "
+ site.
head
)
println
(
"最后一个网站是 : "
+ site.
tail
)
println
(
"查看列表 site 是否为空 : "
+ site.
isEmpty
)
println
(
"查看 nums 是否为空 : "
+ nums.
isEmpty
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
第一网站是 : Runoob
最后一个网站是 : List(Google, Baidu)
查看列表 site 是否为空 : false
查看 nums 是否为空 : true
你可以使用
:::
运算符或
List.:::()
方法或
List.concat()
方法来连接两个或多个列表。实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site1
=
"Runoob"
::
(
"Google"
::
(
"Baidu"
::
Nil
)
)
val
site2
=
"Facebook"
::
(
"Taobao"
::
Nil
)
// 使用 ::: 运算符
var
fruit
=
site1
:::
site2
println
(
"site1 ::: site2 : "
+ fruit
)
// 使用 List.:::() 方法
fruit
=
site1.
:::
(
site2
)
println
(
"site1.:::(site2) : "
+ fruit
)
// 使用 concat 方法
fruit
=
List.
concat
(
site1, site2
)
println
(
"List.concat(site1, site2) : "
+ fruit
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
site1 ::: site2 : List(Runoob, Google, Baidu, Facebook, Taobao)
site1.:::(site2) : List(Facebook, Taobao, Runoob, Google, Baidu)
List.concat(site1, site2) : List(Runoob, Google, Baidu, Facebook, Taobao)
List.fill()
我们可以使用 List.fill() 方法来创建一个指定重复数量的元素列表:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site
=
List.
fill
(
3
)
(
"Runoob"
)
// 重复 Runoob 3次
println
(
"site : "
+ site
)
val
num
=
List.
fill
(
10
)
(
2
)
// 重复元素 2, 10 次
println
(
"num : "
+ num
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
site : List(Runoob, Runoob, Runoob)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
List.tabulate()
List.tabulate() 方法是通过给定的函数来创建列表。
方法的第一个参数为元素的数量,可以是二维的,第二个参数为指定的函数,我们通过指定的函数计算结果并返回值插入到列表中,起始值为 0,实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
// 通过给定的函数创建 5 个元素
val
squares
=
List.
tabulate
(
6
)
(
n
=>
n
*
n
)
println
(
"一维 : "
+ squares
)
// 创建二维列表
val
mul
=
List.
tabulate
(
4
,
5
)
(
_
*
_
)
println
(
"多维 : "
+ mul
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
一维 : List(0, 1, 4, 9, 16, 25)
多维 : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))
List.reverse
List.reverse 用于将列表的顺序反转,实例如下:
object
Test
{
def
main
(
args
:
Array
[
String
]
)
{
val
site
=
"Runoob"
::
(
"Google"
::
(
"Baidu"
::
Nil
)
)
println
(
"site 反转前 : "
+ site
)
println
(
"site 反转后 : "
+ site.
reverse
)
执行以上代码,输出结果为:
$ vim Test.scala
$ scala Test.scala
site 反转前 : List(Runoob, Google, Baidu)
site 反转后 : List(Baidu, Google, Runoob)
Scala List 常用方法
下表列出了 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)