Scala实践4
一、数组
- 在Scala中,用()来访问元素,数组声明的语法格式如下 :
var z:Array[String] = new Array[String](3)
或
var z = new Array[String](3)
- 类型参数化数组
Scala里用new实例化对象,实例过程中,可以用值和类型使对象参数化(在创建实例的同时完成对它的“设置”)。
scala> val greetString =new Array[String](3)
greetString: Array[String] = Array(null, null, null) scala> greetString(0)="Hello"
scala> greetString(1)=","
scala> greetString(2)="world!"
scala> for(i<-0 to 2) print(greetString(i))
Hello,world!
scala>
注:由上可知数组greetString(0)是数组的首个元素,且i<-0 to 2即为(0).to(2)
- 数组缓存
ArrayBuffer与数组类似,保留了所有的Array操作,还允许在序列的开始或结束的地方添加和删除元素。
//先从可变集合包中引用
scala> import scala.collection.mutable.ArrayBufferimport scala.collection.mutable.ArrayBuffer //必须指定ArrayBuffer参数类型,可以不指定长度,可自动调整分配空间
scala> val buf=new ArrayBuffer[Int]()
buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() //使用+=添加元素
scala> buf +=12
res19: buf.type = ArrayBuffer(12)
scala> buf +=15
res20: buf.type = ArrayBuffer(12, 15)
scala> buf
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(12, 15) //缓存可用数组能用的方法
scala> buf.length
res22: Int = 2
scala> buf(0)
res23: Int = 12
二、列表list
列表是同质的,列表中的所有元素都具有相同的类型。元素类型为T的列表类型写作List[T]
- Scala的列表类(List)创建方法如下:
scala> val oneTwoThree=List(1,2,3)//创建并初始化
oneTwoThree: List[Int] = List(1, 2, 3)
- 列表类中定义了“:::”方法实现叠加,用法如下:
scala> val oneTwoThree=List(1,2,3)
oneTwoThree: List[Int] = List(1, 2, 3)
scala> val four=List(4)
four: List[Int] = List(4) scala> val ottf=oneTwoThree:::four
ottf: List[Int] = List(1, 2, 3, 4)
- 列表类中最常用的操作符是“::”,它可以把新元素组合到现有列表的最前端,然后返回作为执行结果的新列表。
scala> val oneTwoThree=List(1,2,3)
oneTwoThree: List[Int] = List(1, 2, 3) scala> val oneTwoThreefour=4::oneTwoThree
oneTwoThreefour: List[Int] = List(4, 1, 2, 3)
- Nil是空列表的简写,::是定义在List类上的方法1,2,3是Int类型,
scala> val oneTwoThreefour=1::2::3::4
<console>:11: error: value :: is not a member of Int
val oneTwoThreefour=1::2::3::4
^ scala> val oneTwoThreefour=1::2::3::4::Nil
oneTwoThreefour: List[Int] = List(1, 2, 3, 4) scala>
- Scala里的列表类型是协变的。这意味着对于每一对类型,S是T的子类型,那么List[S]是List[T] 的子类型。
//List()同样是List[String]的
val xs:List[Sreing]=List() - 构造列表,所有的列表都是由两个基础的构造块Nil和::构造出来的。
- 列表的基本操作:head(返回列表的第一个元素)、tail(返回列表的第一个之外的所有元素)、isEmpty(判断是否为空,返回true)
scala> Nil.head//head和tail都仅能作用在非空列表上,否则抛出异常
java.util.NoSuchElementException: head of empty list
at scala.collection.immutable.Nil$.head(List.scala:430)
... 28 elided
- 连接列表,连接操作是“:::”,它的两个操作元都是列表,且是右结合
scala> List(1,2):::(List(3,4,5):::List(9,8,7))
res12: List[Int] = List(1, 2, 3, 4, 5, 9, 8, 7)
scala> List(1,2):::List(3,4,5):::List(9,8,7)
res13: List[Int] = List(1, 2, 3, 4, 5, 9, 8, 7)
- 列表缓存
//先从可变集合包中引用
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
//实例化
scala> val buf=new ListBuffer[Int]
buf: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
//+=添加元素
scala> buf +=11
res24: buf.type = ListBuffer(11)
scala> buf +=12
res25: buf.type = ListBuffer(11, 12)
scala> buf
res26: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12)
scala> 3+:buf
res27: scala.collection.mutable.ListBuffer[Int] = ListBuffer(3, 11, 12) scala> buf.toList
res28: List[Int] = List(11, 12)
scala> buf
res29: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12) scala> 3 +: buf
res30: scala.collection.mutable.ListBuffer[Int] = ListBuffer(3, 11, 12)
scala> buf
res31: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 12)
//出现问题,toList没有显示出3
scala> buf.toList
res32: List[Int] = List(11, 12)
出现问题,toList没有显示出3
三、元组
- 元组可以包含不同类型的元素,但是和列表一样不可变,把元组实例化需要的对象放在括号里,元组实例化后可以用点号、下划线和基于1的索引访问其他元素,如下:
scala> val pair=(99,"Luft")
pair: (Int, String) = (99,Luft)
scala> println(pair._1)
99
scala> println(pair._2)
Luft
注:元组的实际类型取决于它含有的元素数量和这些元素的类型。故(11,25,s,ss)的类型是
Tupa: (Int, Int, Char, String)
四、集set和映射map
对于set和map来说,Scala同样有可变和不可变的,不过不是阁提供两种选择,而是通过类继承的差别把可变性差异蕴含其中。其中Scala的API包含了set的基本特质,Scala还提供了两个子特质,分别为可变和不可变set。(Java是实现接口,Scala是“扩展”/“混入”了特质。)其中,在Scala中,set和map的层级如下:

- 创建初始化和使用不可变集
scala> var jetSet =Set("Beoing","Airbus")
jetSet: scala.collection.immutable.Set[String] = Set(Beoing, Airbus)
scala> jetSet +="Lear"
scala> println(jetSet.contains("Cessna"))
false
scala> jetSet
res41: scala.collection.immutable.Set[String] = Set(Beoing, Airbus, Lear)
- 创建初始化和使用可变集
//没有引入包
scala> val movieSet = Set("Hitch","Poltergeist")
movieSet: scala.collection.immutable.Set[String] = Set(Hitch, Poltergeist) scala> movieSet += "Shrek"
<console>:13: error: value += is not a member of scala.collection.immutable.Set[String]
Expression does not convert to assignment because receiver is not assignable.
movieSet += "Shrek"
//和上面的不可变集的前两步相同,
//主要是分别用val和var的区别
//引入包
scala> import scala.collection.mutable.Set
import scala.collection.mutable.Set
scala> val movieSet = Set("Hitch","Poltergeist")
movieSet: scala.collection.mutable.Set[String] = Set(Poltergeist, Hitch)
scala> movieSet += "Shrek"
res48: movieSet.type = Set(Poltergeist, Shrek, Hitch)
scala> println(movieSet)
Set(Poltergeist, Shrek, Hitch)

- 不可变的map是默认的,不用引用其他类,创建、初始化和使用不可变映射
scala> val romanNumral = Map(
| 1->"I",2->"II",3->"III",4->"IV",5->"V"
| )
romanNumral: scala.collection.immutable.Map[Int,String] = Map(5 -> V, 1 -> I, 2 -> II, 3 -> III, 4 -> IV) scala> println(romanNumral(4))
IV
- 创建、初始化和使用可变映射
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map scala> val treasureMap=Map[Int,String]()
treasureMap: scala.collection.mutable.Map[Int,String] = Map()
scala> treasureMap+=(1->"Good")
res44: treasureMap.type = Map(1 -> Good)
scala> treasureMap+=(2->"kid")
res45: treasureMap.type = Map(2 -> kid, 1 -> Good)
scala> treasureMap+=(3->"!")
res46: treasureMap.type = Map(2 -> kid, 1 -> Good, 3 -> !)
scala> println(treasureMap(2))
kid
没有导入包的测试如下:
scala> val treasureMap=Map[Int,String]()
treasureMap: scala.collection.immutable.Map[Int,String] = Map() scala> treasureMap+=(1->"Good")
<console>:13: error: value += is not a member of scala.collection.immutable.Map[Int,String]
Expression does not convert to assignment because receiver is not assignable.
treasureMap+=(1->"Good")
注:var和val的声明,和mutable和immuatble之间的联系
Scala实践4的更多相关文章
- Scala实践14
1.Scala的future 创建future import scala.concurrent._ import ExecutionContext.Implicits.global object Fu ...
- Scala实践13
1.隐式参数 方法可以具有隐式参数列表,由参数列表开头的implicit关键字标记.如果该参数列表中的参数没有像往常一样传递,Scala将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. S ...
- Scala实践12
1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...
- Scala实践11
1.1泛型类 泛型类是将类型作为参数的类.它们对集合类特别有用. 定义泛类型:泛型类将类型作为方括号内的参数[].一种惯例是使用字母A作为类型参数标识符,但是可以使用任何参数名称. class Sta ...
- Scala实践10
1.模式匹配 模式匹配是一种根据模式检查值的机制.它是switch(Java中语句)的更强大版本,它同样可以用来代替一系列if / else语句. 句法 匹配表达式具有值,match关键字和至少一个c ...
- Scala实践9
1.特征 Traits用于在类之间共享接口和字段.它们类似于Java 8的接口.类和对象可以扩展特征,但是特征不能被实例化,因此没有参数. 定义一个特征 最小特征只是关键字trait和标识符: tra ...
- Scala实践6
1 if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型. scala> val a3=10 a3: Int = 10 sca ...
- Scala实践8
1.1继承类 使用extends关键字,在定义中给出子类需要而超类没有的字段和方法,或者重写超类的方法. class Person { var name = "zhangsan" ...
- Scala实践7
一.类 1.1简单类和无参方法 类的定义通过class关键字实现 scala> class Dog { | private var leg = 4 | def shout(content: St ...
- Scala实践5
一.Scala的层级 1.1类层级 Scala中,Any是所其他类的超类,在底端定义了一些有趣的类NULL和Nothing,是所有其他类的子类. 根类Any有两个子类:AnyVal和AnyRef.其中 ...
随机推荐
- 七个用于数据科学(data science)的命令行工具
七个用于数据科学(data science)的命令行工具 数据科学是OSEMN(和 awesome 相同发音),它包括获取(Obtaining).整理(Scrubbing).探索(Exploring) ...
- Python--day30--tcp协议(建立链接三次握手,断掉链接四次挥手)和UDP协议
TCP协议: tcp是可靠的,面向连接的.建立全双工通信. 建立链接的三次握手 链接一旦建立一定是全双工工通信,必然是双方通信. UDP协议: TCP协议和UDP协议的对比: QQ使用的是UDP,因为 ...
- Python--day43--mysql自增列之起始值和步长
对于自增: 1,查看字段,类型以及是否可以为空,默认值:desc t2; 2,查看表t2是怎么创建的show create table t2; (竖着看)查看表t2是怎么创建的show create ...
- poj 3275 "Ranking the Cows"(DFS or Floyd+bitset<>)
传送门 题意: 农场主 FJ 有 n 头奶牛,现在给你 m 对关系(x,y)表示奶牛x的产奶速率高于奶牛y: FJ 想按照奶牛的产奶速率由高到低排列这些奶牛,但是这 m 对关系可能不能精确确定这 n ...
- P1077 旅行
题目描述 你要进行一个行程为7000KM的旅行,现在沿途有些汽车旅馆,为了安全起见,每天晚上都不开车,住在汽车旅馆,你手里现在已经有一个旅馆列表,用离起点的距离来标识,如下: 0, 990, 1010 ...
- Java 趣事之 a=a++ 和 a=++a(转)
转自:https://blog.csdn.net/LovePluto/article/details/81062176 如果问 a++ 和 ++a 的区别,估计很多都能回答上来.a++ 是先取 a 的 ...
- 2019.12.15 QLU and SNDU期末联赛
题目列表: 1582.柳予欣的舔狗行为 1587.柳予欣的女朋友们在分享水果 1585.柳予欣和她女朋友的购物计划 1579.FFFFFunctions 1588.Zeckendorf 1586.柳予 ...
- 微软软件开发技术二十年回顾-API篇(转)
二. API篇 随着Windows操作系统开始占据主导地位,开发Windows平台下的应用程序成为人们的需要.当然,这也为传统的DOS程序员提供了一种新的编程方法-一种不受设备限制并由事件驱动的编程方 ...
- hibernate映射-继承映射
对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate的继承映射可以理解成持久化类之间的继承关系.例如:人和学生之间的关系.学生继承人,可以认为学生是一个特殊的人,如果对人进 ...
- jsp中获取页面的相对路径
1.在jsp页面的上方加上这段java代码 <%// request.getContextPath() 返回当前页面所在的应用的名字:// request.getSc ...