一、数组

1、定长数组和变长数组

import scala.collection.mutable.ArrayBuffer

object TestScala {
def main(args: Array[String]) {
//初始化一个长度为8的定长数组,其所有元素均为0
val arr1 = new Array[Int]()
//直接打印定长数组,内容为数组的hashcode值
println("arr1="+arr1)
//将数组转换成数组缓冲,就可以看到原数组中的内容了
//toBuffer会将数组转换长数组缓冲
println("arr1.toBuffer="+arr1.toBuffer)
//注意:如果new,相当于调用了数组的apply方法,直接为数组赋值
//初始化一个长度为1的定长数组
val arr2 = Array[Int]()
println("arr2.toBuffer="+arr2.toBuffer)
//定义一个长度为3的定长数组
val arr3 = Array("hadoop", "storm", "spark")
//使用()来访问元素
println("arr3(2)="+arr3()) //////////////////////////////////////////////////
//变长数组(数组缓冲)
//如果想使用数组缓冲,需要导入import scala.collection.mutable.ArrayBuffer包
var ab = ArrayBuffer[Int]()
//向数组缓冲的尾部追加一个元素
//+=尾部追加元素
ab +=
//追加多个元素
ab += (, , , )
//追加一个数组++=
ab ++= Array(, )
//追加一个数组缓冲
ab ++= ArrayBuffer(,)
//打印数组缓冲ab //在数组某个位置插入元素用insert
ab.insert(, -, )
//删除数组某个位置的元素用remove
ab.remove(, )
println("ab="+ab) } }

运行结果

2、遍历数组

(1)增强for循环

(2)好用的until会生成脚标,0 until 10 包含0不包含10

def main(args: Array[String]) {
//初始化一个数组
val arr = Array(,,,,,,,)
//增强for循环
for(i <- arr)
print(i+"\t") println()
//好用的until会生成一个Range
//reverse是将前面生成的Range反转
for(i <- ( until arr.length).reverse)
print(arr(i))
}

3、数组转换

yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变

def main(args: Array[String]) {
//定义一个数组
val arr = Array(, , , , , , , , )
//将偶数取出乘以10后再生成一个新的数组
val res = for (e <- arr if e % == ) yield e *
println(res.toBuffer) //更高级的写法,用着更爽
//filter是过滤,接收一个返回值为boolean的函数
//map相当于将数组中的每一个元素取出来,应用传进去的函数
val r = arr.filter(_ % == ).map(_ * )
println(r.toBuffer) }

4、常用数组的算法

在Scala中,数组上的某些方法对数组进行相应的操作非常方便!

二、映射(Map)

在Scala中,把哈希表这种数据结构叫做映射

1、构建映射

2、获取映射中的值

getOrElse:有就返回对应的值,没有就返回默认值

注意:在Scala中,有两种Map,

一个是immutable包下的Map,Map中的内容不可变

另一个是mutable包下的Map,该Map中的内容可变 (val var)

注意:通常我们在创建一个集合是会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着该变量的引用不可变,该引用中的内容是不是可变,取决于这个引用指向的集合的类型

1:是否可以修改值

Mutable  可以修改map里面的值

Immutable 不可以修改里面的值

2:是否可以追加元素

2.1  mutable var/val 都可以追加元素

2.2  imtable var 可以追加,val不可以追加

三、元组

映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。

1、创建元组

2、获取元组中的值

3、将对偶的元组转换成映射

4、拉链操作

zip命令可以将多个值绑定在一起

注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数

四、集合

Scala 集合类系统地区分了可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。这意味着你可以修改,添加,移除一个集合的元素。而不可变集合类,相比之下,永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。

所有的集合类都可以在包scala.collection 或scala.collection.mutablescala.collection.immutablescala.collection.generic中找到。客户端代码需要的大部分集合类都独立地存在于3种变体中,它们位于scala.collectionscala.collection.immutablescala.collection.mutable包。每一种变体在可变性方面都有不同的特征。

scala.collection.immutable包是的集合类确保不被任何对象改变。例如一个集合创建之后将不会改变。因此,你可以相信一个事实,在不同的点访问同一个集合的值,你将总是得到相同的元素。

scala.collection.mutable包的集合类则有一些操作可以修改集合。所以处理可变集合意味着你需要去理解哪些代码的修改会导致集合同时改变。

scala.collection包中的集合,既可以是可变的,也可以是不可变的。例如:collection.IndexedSeq[T]] 就是 collection.immutable.IndexedSeq[T] 和collection.mutable.IndexedSeq[T]这两类的超类。scala.collection包中的根集合类中定义了相同的接口作为不可变集合类,同时,scala.collection.mutable包中的可变集合类代表性的添加了一些有辅助作用的修改操作到这个immutable 接口。

根集合类与不可变集合类之间的区别是不可变集合类的客户端可以确保没有人可以修改集合。然而,根集合类的客户端仅保证不修改集合本身。即使这个集合类没有提供修改集合的静态操作,它仍然可能在运行时作为可变集合被其它客户端所修改。

默认情况下,Scala 一直采用不可变集合类。例如,如果你仅写了Set 而没有任何加前缀也没有从其它地方导入Set,你会得到一个不可变的set,另外如果你写迭代,你也会得到一个不可变的迭代集合类,这是由于这些类在从scala中导入的时候都是默认绑定的。为了得到可变的默认版本,你需要显式的声明collection.mutable.Setcollection.mutable.Iterable.

一个有用的约定,如果你想要同时使用可变和不可变集合类,只导入collection.mutable包即可。

import scala.collection.mutable  //导入包scala.collection.mutable

然而,像没有前缀的Set这样的关键字, 仍然指的是一个不可变集合,然而mutable.Set指的是可变的副本(可变集合)。

集合树的最后一个包是collection.generic。这个包包含了集合的构建块。集合类延迟了collection.generic类中的部分操作实现,另一方面集合框架的用户需要引用collection.generic中类在异常情况中。

为了方便和向后兼容性,一些导入类型在包scala中有别名,所以你能通过简单的名字使用它们而不需要import。这有一个例子是List 类型,它可以用以下两种方法使用,如下:

scala.collection.immutable.List // 这是它的定义位置
scala.List //通过scala 包中的别名
List // 因为scala._ // 总是是被自动导入。

下面的图表显示了scala.collection包中所有的集合类。这些都是高级抽象类或特性,它们通常具备和不可变实现一样的可变实现。

下面的图表显示scala.collection.immutable中的所有集合类。

下面的图表显示scala.collection.mutable中的所有集合类。

Seq

不可变的序列 import scala.collection.immutable._

在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。

9 :: List(5, 2)  :: 操作符是将给定的头和尾创建一个新的列表

注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

def main(args: Array[String]): Unit = {
//创建一个不可变集合
val list1 = List(,,)
//将0插入到集合list1的前面生成一个新的list
val list2 = :: list1
val list3 = list1.:: ()
val list4 = +: list1
val list5 = list1. +: ()
println("list2=" + list2)
println("list3=" + list3)
println("list4=" + list4)
println("list5=" + list5) //将3插入到集合list1的后面生成一个新的list
val list6 = list1 :+
println("list6="+list6) //将2个list集合合并成一个新的list集合
val list0 = List(,,)
println("list0="+list0)
val list7 = list1 ++ list0
println("list7="+list7) //将list0插入到list1前面生成一个新的集合
val list8 = list0 ++: list1
println("list8="+list8) //将list1插入到list0前面生成一个新的集合
val list9 = list1 ++: list0
println("list9="+list9) }

可变的序列 import scala.collection.mutable._

def main(args: Array[String]): Unit = {
//构建一个可变序列
val list1 = ListBuffer[Int](,,)
//创建一个空的可变序列
val list2 = new ListBuffer[Int]
//向list2中追加元素,注意:没有生成新的集合
list2 +=
list2.append()
println("list2=" + list2) //将list2中的元素追加到list1中,注意:没有生成新的集合
list1 ++= list2
print("list1=" + list1) //将list1和list2合并成一个新的list集合,注意:生成新的集合
val list3 = list1 ++ list2
println("list3=" + list3) //将元素追加到list1后面生成一个新的集合
val list4 = list1 :+
print("list4=" + list4) }

Set

不可变的Set

def main(args: Array[String]): Unit = {
//创建一个空的set
val set1 = new HashSet[Int]()
println("set1=" + set1)
//将元素和set合并生成一个新的set,原有set不变
val set2 = set1 +
println("set2=" + set2)
//set中元素不能重复
val set3 = set1 ++ Set(,,)
println("set3=" + set3)
val set4 = Set(,,) ++ set2
println("set4=" + set4)
}

可变的Set

def main(args: Array[String]): Unit = {
//创建一个可变的set
val set1 = new mutable.HashSet[Int]()
println("list1=" + set1)
//向set1中添加元素
set1 +=
//add等价于+=
set1.add()
set1 ++= Set(,,)
println("set1="+set1)
//删除一个元素
set1 -=
set1.remove()
println("set1=" + set1) }

Scala学习之路 (四)Scala的数组、映射、元组、集合的更多相关文章

  1. Scala进阶之路-高级数据类型之数组的使用

    Scala进阶之路-高级数据类型之数组的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的初始化方式 1>.长度不可变数组Array 注意:顾名思义,长度不可变数 ...

  2. Scala 学习之路(四)—— 数组Array

    一.定长数组 在Scala中,如果你需要一个长度不变的数组,可以使用Array.但需要注意以下两点: 在Scala中使用(index)而不是[index]来访问数组中的元素,因为访问元素,对于Scal ...

  3. Scala学习笔记(四)—— 数组

    定长数组Array 定义定长数组用Array,有如下几种方法: 初始化一个长度为8的定长数组,其所有元素默认值均为0 scala> new Array[Int](8) res0: Array[I ...

  4. Scala学习之路----基础入门

    一.Scala解释器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)-> Loop(循环) scala解释器也被称为REPL,会快速编译s ...

  5. scala学习笔记(四)样本类与模式匹配

    访问修饰符 格式:private[x]或protected[x],x指某个所属包.类或单例对象,表示被修饰的类(或方法.单例对象),在X域中公开,在x域范围内都可以访问: private[包名]:在该 ...

  6. Scala学习之路 (十)Scala的Actor

    一.Scala中的并发编程 1.Java中的并发编程 ①Java中的并发编程基本上满足了事件之间相互独立,但是事件能够同时发生的场景的需要. ②Java中的并发编程是基于共享数据和加锁的一种机制,即会 ...

  7. Scala学习之路 (六)Scala的类、对象、继承、特质

    一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...

  8. Scala 学习之路(七)—— 常用集合类型之 Map & Tuple

    一.映射(Map) 1.1 构造Map // 初始化一个空map val scores01 = new HashMap[String, Int] // 从指定的值初始化Map(方式一) val sco ...

  9. Scala 学习之路(九)—— 继承和特质

    一.继承 1.1 Scala中的继承结构 Scala中继承关系如下图: Any是整个继承关系的根节点: AnyRef包含Scala Classes和Java Classes,等价于Java中的java ...

随机推荐

  1. SQL Server T—SQL 存储过程 触发器

    一.存储过程 存储过程是一组编译在单个执行计划中的T-SQL语句 存储过程:就像函数一样的会保存在数据库中(可编程性) 存储过程的优点: 1.允许模块化程序设计 2.允许更快执行如果某操作需要大量T- ...

  2. asp.net的get和post请求

    asp.net的get和post请求 //获取第三方api的工具类 public class HttpUtils { public static string Get(string Url) { // ...

  3. java - 线程等待与唤醒

    Java多线程系列--“基础篇”05之 线程等待与唤醒 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. w ...

  4. JFinal -基于Java 语言的MVC极速 web 开发框架

    JFinal概述 JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再 ...

  5. short、int、long、float、double区别

    一.基本数据类型的特点,位数,最大值和最小值.1.基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 (-2的15此方 ...

  6. equals与hashcode区别

    哈希码:   hashCode的作用是用来获取哈希码,也可以称作散列码.实际返回值为一个int型数据.用于确定对象在哈希表中的位置. Object中有hashcode方法,也就意味着所有的类都有has ...

  7. jQuery中.bind() .live() .delegate() .on()区别

    $(selector).bind(event,data,function) $(selector).live(event,data,function)//jquery1.9版本以下支持,jquery1 ...

  8. 防范跨站脚本攻击(XXS)的关键手段

    1:加强对提交信息和页面显示信息的过滤,让非法提交内容无处施展: 2:让存储在cookie中的sessionid 无法被js 读取到. 如今的xss 相比网上很多资料中,在技术上已经发生了很大变化.由 ...

  9. T-SQL的timestamp类型实际应用

    目录 0x00 适用场景 0x01 问题描述 0x02 字节数组 0x03 Base64编码 0x04 其实没那么麻烦 0x05 回顾 0x00 适用场景 1. 前端: JavaScript 2. 后 ...

  10. Hibernate中Session.get()方法和load()方法的详细比较

    一.get方法和load方法的简易理解  (1)get()方法直接返回实体类,如果查不到数据则返回null.load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用 ...