本节主要内容

  1. 数组操作实战
  2. 列表List操作实战

数组操作实战

1 定长数组

//定义一个长度为10的数值数组
scala> val numberArray=new Array[Int](10)
numberArray: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
//定义一个长度为10的String类型数组
scala> val strArray=new Array[String](10)
strArray: Array[String] = Array(null, null, null, null, null, null, null, null,
null, null)//可以看出:复杂对象类型在数组定义时被初始化为null,数值型被初始化为0//数组元素赋值
scala> strArray(0)="First Element"
//需要注意的是,val strArray=new Array[String](10)
//这意味着strArray不能被改变,但数组内容是可以改变的
scala> strArray
res62: Array[String] = Array(First Element, null, null, null, null, null, null,
null, null, null)//另一种定长数组定义方式
//这种调用方式其实是调用其apply方法进行数组创建操作
scala> val strArray2=Array("First","Second")
strArray2: Array[String] = Array(First, Second)Scala中的Array以Java中的Array方式实现

2 变长数组 ArrayBuffer

//要使用ArrayBuffer,先要引入scala.collection.mutable.ArrayBuffer
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer//创建String类型ArrayBuffer数组缓冲
scala> val strArrayVar=ArrayBuffer[String]()
strArrayVar: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer()//+=意思是在尾部添加元素
scala>     strArrayVar+="Hello"
res63: strArrayVar.type = ArrayBuffer(Hello)//+=后面还可以跟多个元素的集合
//注意操作后的返回值
scala> strArrayVar+=("World","Programmer")
res64: strArrayVar.type = ArrayBuffer(Hello, World, Programmer)//显示完整数组内容
scala> strArrayVar
res65: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(Hello, World,
Programmer)//++=用于向数组中追加内容,++=右侧可以是任何集合
//追加Array数组
scala> strArrayVar++=Array("Wllcome","To","XueTuWuYou")
res66: strArrayVar.type = ArrayBuffer(Hello, World, Programmer, Wllcome, To, Xue
TuWuYou)
//追加List
scala> strArrayVar++=List("Wellcome","To","XueTuWuYou")
res67: strArrayVar.type = ArrayBuffer(Hello, World, Programmer, Wllcome, To, Xue
TuWuYou, Wellcome, To, XueTuWuYou)//删除末尾n个元素
scala> strArrayVar.trimEnd(3)scala> strArrayVar
res69: scala.collection.mutable.ArrayBuffer[String] = ArrayBuffer(Hello, World,
Programmer, Wllcome, To, XueTuWuYou)
  • 1
//创建整型数组缓冲
scala> var intArrayVar=ArrayBuffer(1,1,2)
intArrayVar: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2)//在数组索引为0的位置插入元素6
scala> intArrayVar.insert(0,6)scala> intArrayVar
res72: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(6, 1, 1, 2)//在数组索引为0的位置插入元素7,8,9
scala> intArrayVar.insert(0,7,8,9)scala> intArrayVar
res74: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(7, 8, 9, 6, 1, 1,2)//从索引0开始,删除4个元素
scala> intArrayVar.remove(0,4)scala> intArrayVar
res77: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2)//转成定长数组
scala> intArrayVar.toArray
res78: Array[Int] = Array(1, 1, 2)//将定长数组转成ArrayBuffer
scala> res78.toBuffer
res80: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 1, 2)
  • 1

3 数组的遍历

//to
scala> for(i <- 0 to intArrayVar.length-1) println("Array Element: " +intArrayVar(i))
Array Element: 1
Array Element: 1
Array Element: 2
//until
scala> for(i <- 0 until intArrayVar.length) println("Array Element: " +intArrayVar(i))
Array Element: 1
Array Element: 1
Array Element: 2//数组方式(推荐使用)
scala> for(i <- intArrayVar) println("Array Element: " + i)
Array Element: 1
Array Element: 1
Array Element: 2//步长为2
scala>  for(i <- 0 until (intArrayVar.length,2)) println("Array Element: " +intA
rrayVar(i))
Array Element: 1
Array Element: 2//倒序输出
scala> for( i<- (0 until intArrayVar.length).reverse) println("Array Element: "+intArrayVar(i))
Array Element: 2
Array Element: 1
Array Element: 1

4 数组转换

//生成新的数组,原数组不变
//缓冲数据转换后产生的仍然是缓冲数组
scala> var intArrayVar2=for(i <- intArrayVar) yield i*2
intArrayVar2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 2, 4)//定长数组转转后产生的仍然是定长数组,原数组不变
scala> var intArrayNoBuffer=Array(1,2,3)
intArrayNoBuffer: Array[Int] = Array(1, 2, 3)scala> var intArrayNoBuffer2=for(i <- intArrayNoBuffer) yield i*2
intArrayNoBuffer2: Array[Int] = Array(2, 4, 6)//加入过滤条件
scala>  var intArrayNoBuffer2=for(i <- intArrayNoBuffer if i>=2) yield i*2
intArrayNoBuffer2: Array[Int] = Array(4, 6)

5 数组操作中的常用算法

//定义一个整型数组
scala> val intArr=Array(1,2,3,4,5,6,7,8,9,10)
intArr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)//求和
scala> intArr.sum
res87: Int = 55//求最大值
scala> intArr.max
res88: Int = 10scala> ArrayBuffer("Hello","Hell","Hey","Happy").max
res90: String = Hey//求最小值
scala> intArr.min
res89: Int = 1//toString()方法
scala> intArr.toString()
res94: String = [I@141aba8//mkString()方法
scala> intArr.mkString(",")
res96: String = 1,2,3,4,5,6,7,8,9,10scala> intArr.mkString("<",",",">")
res97: String = <1,2,3,4,5,6,7,8,9,10>
  • 1

6 ArrayBuffer Scaladoc解析

初学者在查看sacaladoc时常常会感到困惑,不用担心,随着学习的深入,api文档中的内容将逐渐清晰
下面给出两个示例:
++=方法传入的参数类型是TraversableOnce Trait的子类,它返回的是更新好的ArrayBuffer

dropWhile传入的是一个函数,该函数返回值是布尔类型,dropWhile反回的是操作后的ArrayBuffer

7 多维数组

通过数组的数组实现多维数组的定义:

//定义2行3列数组
scala> var multiDimArr=Array(Array(1,2,3),Array(2,3,4))
multiDimArr: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))//获取第一行第三列元素
scala> multiDimArr(0)(2)
res99: Int = 3//多维数组的遍历
scala> for(i <- multiDimArr) println( i.mkString(","))
1,2,3
2,3,4
  • 1

列表List操作实战

1 List类型定义及List的特点

//字符串类型List
scala> val fruit=List("Apple","Banana","Orange")
fruit: List[String] = List(Apple, Banana, Orange)//前一个语句与下面语句等同
scala> val fruit=List.apply("Apple","Banana","Orange")
fruit: List[String] = List(Apple, Banana, Orange)//数值类型List
scala> val nums=List(1,2,3,4,5)
nums: List[Int] = List(1, 2, 3, 4, 5)//多重List,List的子元素为List
scala> val diagMatrix=List(List(1,0,0),List(0,1,0),List(0,0,1))
diagMatrix: List[List[Int]] = List(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))//遍历List
scala> for (i <- nums) println("List Element: "+i)
List Element: 1
List Element: 2
List Element: 3
List Element: 4
List Element: 5

不难看出,List与Array有着诸多的相似之处,但它们有两个明显的区别:
1 List一但创建,其值不能被改变
如前面的nums,改变其值的话,编译器会报错

scala> nums(3)=4
<console>:10: error: value update is not a member of List[Int]nums(3)=4

2 List具有递归结构(Recursive Structure),例如链表结构

List类型和其它类型集合一样,它具有协变性(Covariant),即对于类型S和T,如果S是T的子类型,则List[S]也是List[T]的子类型

例如

scala> var listStr:List[Object]=List("This","Is","Covariant","Example")
listStr: List[Object] = List(This, Is, Covariant, Example)//空的List,其类型为Nothing,Nothing在Scala的继承层次中的最低层
//,即Nothing是任何Scala其它类型如String,Object等的子类
scala> var listStr=List()
listStr: List[Nothing] = List()scala> var listStr:List[String]=List()
listStr: List[String] = List()
  • 1

2 List常用构造方法

//采用::及Nil进行列表构建
scala> val nums = 1 :: (2 :: (3 :: (4 :: Nil)))
nums: List[Int] = List(1, 2, 3, 4)//由于::操作符的优先级是从右往左的,因此上一条语句等同于下面这条语句
scala> val nums=1::2::3::4::Nil
nums: List[Int] = List(1, 2, 3, 4)

3 List常用操作

//判断是否为空
scala> nums.isEmpty
res108: Boolean = false//取第一个无素
scala> nums.head
res109: Int = 1//取除第一个元素外剩余的元素,返回的是列表
scala> nums.tail
res114: List[Int] = List(2, 3, 4)//取列表第二个元素
scala> nums.tail.head
res115: Int = 2//插入排序算法实现
def isort(xs: List[Int]): List[Int] =
if (xs.isEmpty) Nil
else insert(xs.head, isort(xs.tail))def insert(x: Int, xs: List[Int]): List[Int] =
if (xs.isEmpty || x <= xs.head) x :: xs
else xs.head :: insert(x, xs.tail)//List连接操作
scala> List(1,2,3):::List(4,5,6)
res116: List[Int] = List(1, 2, 3, 4, 5, 6)//取除最后一个元素外的元素,返回的是列表
scala> nums.init
res117: List[Int] = List(1, 2, 3)//取列表最后一个元素
scala> nums.last
res118: Int = 4//列表元素倒置
scala> nums.reverse
res119: List[Int] = List(4, 3, 2, 1)//一些好玩的方法调用
scala> nums.reverse.reverse==nums
res120: Boolean = truescala> nums.reverse.init
res121: List[Int] = List(4, 3, 2)scala> nums.tail.reverse
res122: List[Int] = List(4, 3, 2)//丢弃前n个元素
scala> nums drop 3
res123: List[Int] = List(4)scala> nums drop 1
res124: List[Int] = List(2, 3, 4)//获取前n个元素
scala> nums take 1
res125: List[Int] = List(1)scala> nums.take(3)
res126: List[Int] = List(1, 2, 3)//将列表进行分割
scala> nums.splitAt(2)
res127: (List[Int], List[Int]) = (List(1, 2),List(3, 4))//前一个操作与下列语句等同
scala> (nums.take(2),nums.drop(2))
res128: (List[Int], List[Int]) = (List(1, 2),List(3, 4))//Zip操作
scala> val nums=List(1,2,3,4)
nums: List[Int] = List(1, 2, 3, 4)scala> val chars=List('1','2','3','4')
chars: List[Char] = List(1, 2, 3, 4)//返回的是List类型的元组(Tuple)
scala> nums zip chars
res130: List[(Int, Char)] = List((1,1), (2,2), (3,3), (4,4))//List toString方法
scala> nums.toString
res131: String = List(1, 2, 3, 4)//List mkString方法
scala> nums.mkString
res132: String = 1234//转换成数组
scala> nums.toArray
res134: Array[Int] = Array(1, 2, 3, 4)
  1. List伴生对象方法
//apply方法
scala>  List.apply(1, 2, 3)
res139: List[Int] = List(1, 2, 3)//range方法,构建某一值范围内的List
scala>  List.range(2, 6)
res140: List[Int] = List(2, 3, 4, 5)//步长为2
scala>  List.range(2, 6,2)
res141: List[Int] = List(2, 4)//步长为-1
scala>  List.range(2, 6,-1)
res142: List[Int] = List()scala>  List.range(6,2 ,-1)
res143: List[Int] = List(6, 5, 4, 3)//构建相同元素的List
scala> List.make(5, "hey")
res144: List[String] = List(hey, hey, hey, hey, hey)//unzip方法
scala> List.unzip(res145)
res146: (List[Int], List[Char]) = (List(1, 2, 3, 4),List(1, 2, 3, 4))//list.flatten,将列表平滑成第一个无素
scala> val xss =| List(List('a', 'b'), List('c'), List('d', 'e'))
xss: List[List[Char]] = List(List(a, b), List(c), List(d, e))
scala> xss.flatten
res147: List[Char] = List(a, b, c, d, e)//列表连接
scala> List.concat(List('a', 'b'), List('c'))
res148: List[Char] = List(a
, b, c)

Scala入门到精通——第三节 Array、List相关推荐

  1. Scala入门到精通——第十三节 高阶函数

    本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返 ...

  2. Scala入门到精通——第二十三节 高级类型 (二)

    本节主要内容 中置类型(Infix Type) 存在类型 函数类型 抽象类型 关于语法糖的问题,在讲解程序语言时,我们常常听到"语法糖"这个术语,在百度百科中,它具有如下定义: 语 ...

  3. Scala入门到精通——第十四节 Case Class与模式匹配(一)

    本节主要内容 模式匹配入门 Case Class简介 Case Class进阶 1. 模式匹配入门 在Java语言中存在switch语句,例如: //下面的代码演示了java中switch语句的使用 ...

  4. Scala入门到精通——第三十节 Scala脚本编程与结束语

    本节主要内容 REPL命令行高级使用 使用Scala进行Linux脚本编程 结束语 1. REPL命令行高级使用 在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题, ...

  5. Scala入门到精通——第二十八节 Scala与JAVA互操作

    本节主要内容 JAVA中调用Scala类 Scala中调用JAVA类 Scala类型参数与JAVA泛型互操作 Scala与Java间的异常处理互操作 1. JAVA中调用Scala类 Java可以直接 ...

  6. Scala入门到精通——第二十六节 Scala并发编程基础

    本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 1. Scala并发编程简介 2003 年,Herb Sutte ...

  7. Scala入门到精通——第二十五节 提取器(Extractor)

    本节主要内容 apply与unapply方法 零变量或变量的模式匹配 提取器与序列模式 scala中的占位符使用总结 1. apply与unapply方法 apply方法我们已经非常熟悉了,它帮助我们 ...

  8. Scala入门到精通——第二十二节 高级类型 (一)

    本节主要内容 this.type使用 类型投影 结构类型 复合类型 1. this.type使用 class Person{private var name:String=nullprivate va ...

  9. Scala入门到精通——第二十一节 类型参数(三)-协变与逆变

    本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...

最新文章

  1. ES6 Rest参数
  2. PHP 不跳转界面取input值进行验证_【Python】tesseract+uiautomator2+夜神模拟器 悠长假期手游集市识别验证码自动购买 - Amorius...
  3. php 输出true false
  4. Mylyn 2.0,第 2 部分: 自动上下文管理
  5. 如何设计折叠样式的屏幕(类似MIGO的屏幕)
  6. 20161207py学习笔记
  7. P6134-[JSOI2015]最小表示【bitset,拓扑排序】
  8. ka3525_如何使用KA Lite投放教育内容
  9. fpga初始化错误_FPGA的ROM初始化问题讨论
  10. (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
  11. Linux系统如何安装不知名称的软件?
  12. LabVIEW前面板数值控件显示7段LED数码管样式
  13. 4用计算机显示内存不足,电脑提示内存不足的解决方法总汇
  14. mysql查询每个学生的各科成绩,以及总分和平均分(实操版)
  15. 即将创业的我转发一篇鸡汤文---采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
  16. 【职场加油站】给职场新人的几条忠告
  17. 域策略设置计算机睡眠,win10专业版中如何使用组策略跳过从睡眠中恢复的密码提示...
  18. 基于Linux系统的边界网关协议的设计与实现
  19. 奶爸日记15 - 轮船风景
  20. Java验证码(图片、字符串)生成工具

热门文章

  1. c++ vector拷贝构造_vector------stl学习笔记一
  2. ab压力测试(了解ab工具,实验对网页进行测试)
  3. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点
  4. java中输出时间12小时制转换为24小时制显示
  5. css 一侧是三角形的矩形_5种具有CSS形状和滤镜的精美图像效果
  6. centos下搭建网站服务器,Centos7搭建web服务器
  7. socket只能连接本地mysql_MySQL本地用IP登陆而非socket
  8. 复制linux内核,linux内核写时复制机制源代码解读
  9. php memcached windows,php memcached windows安装
  10. dom4j读取xml信息