Scala入门到精通——第三节 Array、List
本节主要内容
- 数组操作实战
- 列表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)
- 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相关推荐
- Scala入门到精通——第十三节 高阶函数
本节主要内容 高阶函数简介 Scala中的常用高阶函数 SAM转换 函数柯里化 部分应用函数 1. 高阶函数简介 高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返 ...
- Scala入门到精通——第二十三节 高级类型 (二)
本节主要内容 中置类型(Infix Type) 存在类型 函数类型 抽象类型 关于语法糖的问题,在讲解程序语言时,我们常常听到"语法糖"这个术语,在百度百科中,它具有如下定义: 语 ...
- Scala入门到精通——第十四节 Case Class与模式匹配(一)
本节主要内容 模式匹配入门 Case Class简介 Case Class进阶 1. 模式匹配入门 在Java语言中存在switch语句,例如: //下面的代码演示了java中switch语句的使用 ...
- Scala入门到精通——第三十节 Scala脚本编程与结束语
本节主要内容 REPL命令行高级使用 使用Scala进行Linux脚本编程 结束语 1. REPL命令行高级使用 在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题, ...
- Scala入门到精通——第二十八节 Scala与JAVA互操作
本节主要内容 JAVA中调用Scala类 Scala中调用JAVA类 Scala类型参数与JAVA泛型互操作 Scala与Java间的异常处理互操作 1. JAVA中调用Scala类 Java可以直接 ...
- Scala入门到精通——第二十六节 Scala并发编程基础
本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 1. Scala并发编程简介 2003 年,Herb Sutte ...
- Scala入门到精通——第二十五节 提取器(Extractor)
本节主要内容 apply与unapply方法 零变量或变量的模式匹配 提取器与序列模式 scala中的占位符使用总结 1. apply与unapply方法 apply方法我们已经非常熟悉了,它帮助我们 ...
- Scala入门到精通——第二十二节 高级类型 (一)
本节主要内容 this.type使用 类型投影 结构类型 复合类型 1. this.type使用 class Person{private var name:String=nullprivate va ...
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
本节主要内容 协变 逆变 类型通匹符 1. 协变 协变定义形式如:trait List[+T] {} .当类型S是类型A的子类型时,则List[S]也可以认为是List[A}的子类型,即List[S] ...
最新文章
- ES6 Rest参数
- PHP 不跳转界面取input值进行验证_【Python】tesseract+uiautomator2+夜神模拟器 悠长假期手游集市识别验证码自动购买 - Amorius...
- php 输出true false
- Mylyn 2.0,第 2 部分: 自动上下文管理
- 如何设计折叠样式的屏幕(类似MIGO的屏幕)
- 20161207py学习笔记
- P6134-[JSOI2015]最小表示【bitset,拓扑排序】
- ka3525_如何使用KA Lite投放教育内容
- fpga初始化错误_FPGA的ROM初始化问题讨论
- (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
- Linux系统如何安装不知名称的软件?
- LabVIEW前面板数值控件显示7段LED数码管样式
- 4用计算机显示内存不足,电脑提示内存不足的解决方法总汇
- mysql查询每个学生的各科成绩,以及总分和平均分(实操版)
- 即将创业的我转发一篇鸡汤文---采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
- 【职场加油站】给职场新人的几条忠告
- 域策略设置计算机睡眠,win10专业版中如何使用组策略跳过从睡眠中恢复的密码提示...
- 基于Linux系统的边界网关协议的设计与实现
- 奶爸日记15 - 轮船风景
- Java验证码(图片、字符串)生成工具
热门文章
- c++ vector拷贝构造_vector------stl学习笔记一
- ab压力测试(了解ab工具,实验对网页进行测试)
- java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点
- java中输出时间12小时制转换为24小时制显示
- css 一侧是三角形的矩形_5种具有CSS形状和滤镜的精美图像效果
- centos下搭建网站服务器,Centos7搭建web服务器
- socket只能连接本地mysql_MySQL本地用IP登陆而非socket
- 复制linux内核,linux内核写时复制机制源代码解读
- php memcached windows,php memcached windows安装
- dom4j读取xml信息