【《快学Scala》笔记】

数组  /  映射  /  元组

一、数组

1、定长数组

声明数组的两种形式:

  • 声明指定长度的数组 val 数组名= new Array[类型](数组长度)

  

  • 提供数组初始值的数组,无需new关键字

  

Scala声明数组时,需要带有Array类名,且使用 () 来指明长度或提供初始值序列。

在JVM中,Scala的Array以Java数组的方式实现。如arr在JVM中的类型对应java.lang.String[],charArr对应char[]。

2、变长数组

  

ArrayBuffer,全称scala.collection.mutable.ArrayBuffer,类似于Java中的ArrayList和C++中的vector,是长度可变数组类型的结构,称为数组缓冲。

通过:val 名 = ArrayBuffer[类型]() 来声明,声明ArrayBuffer时需要指明类型。

通过 += 操作符来添加元素或序列,++= 操作符来拼接数组。

【在ArrayBuffer的尾端添加或删除元素是一个高效的操作。】 ArrayBuffer还支持在指定位置插入、删除元素。

ArrayBuffer到数组的转换: toArray方法

  

3、数组遍历

通过for循环来遍历数组

  

指定遍历数组的步长——通过until(上界, 步长)

  

  

通过reverse函数逆序遍历数组:

  

4、可以通过 for循环+yield 来获得新的数组或ArrayBuffer

  

  

通过for+yield操作数组或ArrayBuffer之后将得到新的数组或ArrayBuffer。

5、操作数组/数组缓冲常用函数

  

求和、求最大最小值、数组排序。通过sorted函数对数组或ArrayBuffer排序时,返回的是一个新的数组或ArrayBuffer,原有的不变。

可以直接对数组调用排序算法,但是不能对ArrayBuffer排序。

  

quickSort是直接修改原数组,而sorted方法是返回新数组

6、多维数组

Scala中的多维数组同Java中一样,多维数组都是数组的数组。

  • 通过 Array.ofDim[类型](维度1, 维度2, 维度3,....)来声明多维数组,如声明二维数组;

  

  从二维数组的初始化中,我们可以看到,多维数组在Scala中也是数组的数组。

  • 通过 Array[ Array[Int]](维度1) 来声明数组,可以声明不规则数组;

  

  多维数组是数组的数组,按照这种性质来声明多维数组,如例子中的二维数组,声明时,需要指定最外围的数组大小。

【注:可以通过scala.collection.JavaConversions包中隐式转换方法来实现Scala容器类与Java中类的转换。】

二、映射

1、映射构造

对偶,即名值对。可以通过 -> 操作符来定义对偶, 名->值 运算的结果是( 名, 值 );

  

也可以声明对偶形式的变量

  

映射是由对偶构成的,映射是对偶的集合。

  • 声明不可变映射,直接使用Map来声明时,默认是不可变映射类型。

  

  【注: 不可变映射维持元素插入顺序。】

  • 声明可变映射(scala.collection.mutable.Map)

  

  【注:放入可变映射中的值并未按照放入顺序来排序的。】

  通过for循环来修改可变Map中的值;

  

  【注:映射可变、不可变指的是整个映射是否可变,包括元素值、映射中元素个数、元素次序等。】

  • 声明空映射

  直接通过 new Map[类型1, 类型2]() 来定义映射会报错,因为Map是抽象的,无法实例化。

  定义空映射时,需要指定映射的实现类,通过new来定义;

  

  分别定义不可变映射与可变映射。注,直接使用 new HashMap定义时会报错。

2、映射常用操作

  • 判断映射中是否含有某个键: map.contains(键值)

  

  • 使用 += 向可变映射中添加元素或拼接映射

  

  • 使用 -= 移除可变映射中的键及对应元素

  

  • 不可变映射可通过 + 操作符返回一个新的不可变映射;不可变映射可通过 - 操作符返回一个新的不可变映射;

  

  • 映射遍历

  

  • 获取映射的键集合keySet和值集合

  

  通过映射的 keySet 方法可以获得映射的由键值构成的集合;通过 values 方法可以获得映射的值集合的Interable对象,应用于循环中。

  Scala的keySet / values 方法类似于Java中的映射方法。

3、Scala中映射的底层实现要么基于哈希表,要么基于平衡树,其中基于平衡树的映射内部是有序的。

  

  Scala目前基于平衡树的映射只提供了不可变版本。

  【注:构建可变有序映射可借助Java的TreeMap。】

4、可变映射中,若要构建维持元素插入顺序的映射可通过LinkedHashMap。

5、通过scala.collection.JavaConversions.mapAsScalaMap可将Java的Map转换为Scala类型的Map;通过scala.collection.JavaConversions.mapAsJavaMap可将Scala的映射转换为Java类型的映射。

6、toMap方法

  使用toMap方法可将对偶组成的集合转化为映射。

  

三、元组

1、元组是不同类型的值的聚集;对偶是最简单的元组。

2、元组表示

  通过将不同的值用小括号括起来,即表示元组。

  

  上例中元组的类型就是 (Int, Double, Char, String) ;元组中可以存放不同类型的值。

3、元组访问

  • 元组中的元素称为组元。可以通过 _1、 _2 、_3 的形式来访问对应下标的组元。

  

  【注:元组中组元下标从1开始。】

  • 通过模式匹配来访问元组中的值

  

  忽略不需要的值。在模式匹配时,通过 _ (万能匹配符)来为不需要获取值的组元占位,每个 _ 仅可以为一个组元占位。

  

4、元组可用于函数返回多个值的情形

  

  上例中,函数定义返回值类型为元组 (Int, String);

  

Scala学习——数组/映射/元组的更多相关文章

  1. Scala学习(四)---映射和元组

    映射和元组 摘要: 一个经典的程序员名言是:"如果只能有一种数据结构,那就用哈希表吧".哈希表或者更笼统地说映射,是最灵活多变的数据结构之一.映射是键/值对偶的集合.Scala有一个通用的叫法:元组, ...

  2. scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例

    package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...

  3. Scala学习四——映射和数组

    一.本章要点 Scala有十分易用的语言来创建,查询和遍历映射 你需要从可变和不可变的映射中做出选择 默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射 你可以很容易地在Scala映射和J ...

  4. scala学习手记5 - 元组与多重赋值

    假定要在一个方法中返回多个值.比如需要返回一个人的名.姓和邮箱地址.在Java中最常用的方法是定义一个Person类,其中包括相对应的字段:还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循 ...

  5. Scala学习---数组

    1.编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 /** * Created by vito on 2017/1/11. */ object ex1 { ...

  6. TypeScript学习——数组、元组、接口(2)

    数组 数组类型注解 const numberArr: (number | string)[] = [1, '2', 3]; //既可以是number 也可以是string const stringAr ...

  7. scala 学习笔记十 元组

    1.元组初始化 2.元组作为函数返回值 3.元组拆包 上面168行 ,单个val后面跟着一个由五个标识符构成的元组,表示对ff返回的元组进行拆包 上面174行,将整个元组捕获到单个val或var中,那 ...

  8. Scala详解---------数组、元组、映射

    一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需new关键字 Scala声明数组时,需要带有Arr ...

  9. Scala具体解释---------数组、元组、映射

    一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需newkeyword Scala声明数组时.须要带 ...

随机推荐

  1. 第二章 管理程序流(In .net4.5) 之 管理多线程

    1. 概述 本章包括同步资源以及取消长时间任务相关的内容. 2. 主要内容 2.1 同步资源 ① lock关键字实现.会阻塞程序,有可能会导致死锁. ② volatile关键字可以禁用编译优化,用于避 ...

  2. 银行卡BIN码大全

    BIN号即银行标识代码的英文缩写.BIN由6位数字表示,出现在卡号的前6位,由国际标准化组织(ISO)分配给各从事跨行转接交换的银行卡组织.银行卡的卡号是标识发卡机构和持卡人信息的号码,由以下三部分组 ...

  3. 【转载】alter table move 和 alter table shrink space的区别

    move 和shrink 的共同点1.收缩段2.消除部分行迁移3.消除空间碎片4.使数据更紧密 shrink 语法:  alter table TABLE_NAME shrink space [com ...

  4. Excel日期格式提取year

    Excel日期格式提取year =TEXT(YEAR(C2),"0000")

  5. AppCan移动平台开发常见问题解答

    在使用AppCan移动平台开发跨平台APP时,有开发者会遇到一些问题, 不急,跟笔者一起来聊一聊使用AppCan平台开发中常见问题的解答方法. 问1.正常是按照官网提供的4个iphone启动图尺寸来做 ...

  6. Android 创建单例模式的几种方法

    java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.特点:1,一个类只能有一个实例2,自己创建这个实例3,整个系统都要使用这个实例 Singleton模式 ...

  7. linux 禁止指定账号ssh登陆

    1 2 3 4 vim /etc/pam.d/sshd   #在第一行添加以下代码 auth       required     pam_listfile.so item=user sense=de ...

  8. 初识java之Mina(一)

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于 TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供 JAVA 对象的序列化服务.虚拟机管道通信服务等) ...

  9. [转]STUN和TURN技术浅析

    [转]STUN和TURN技术浅析 http://www.h3c.com.cn/MiniSite/Technology_Circle/Net_Reptile/The_Five/Home/Catalog/ ...

  10. homework-02 二维的,好喝的(二维数组的各种子数组)

    1)输入部分 对于输入部分,我定义的输入格式是这样的 前两行为列数和行数 如果文件无法打开,或者输入文件格式不对,均会提示出错并退出 2)二维数组的最大矩形子数组 首先,我使用最最简单的暴力算法,直接 ...