数组

  • 定长数组:在Scala中可以用Array,初始化一个定长数组。例如:

    val nums = new Array[Int](10)  //10个整数的数组,所有元素初始化为0
    val a = new Array[String](10)  //10个元素的字符串数组,所有元素初始化为null
    val s = Array("Hello", "Scala")  //长度为2的字符串数组
    s(0) = "Hi"  //使用()来访问数组中的元素,使得s变成Array("Hi","Scala")



    注:已提供初始值就不需要使用new

    在JVM中,Scala的Array以Java数组方式实现,如字符串数组对应java.lang.String[]IntDouble等基本数据类型对应Java中都是基本数据类型数组,如Array(2,3,4)在JVM中就是一个int[]

  • 变长数组(数组缓冲):Scala中使用ArrayBuffer来实现。使用前需要引入包import scala.collection.mutable.ArrayBuffer

    1.用+=在尾部添加元素。

    2.用+=在尾部添加多个元素,用括号包起来。

    3.用++=追加任何元素。

    4.移除尾部的三个元素。



    insert可以在任意位置插入元素。remove可以在任意位置删除元素。缺点是:这样做需要移动后面的元素。

    变长数组可以和定长数组之间相互转换,通过使用toArraytoBuffer

  • 转换:在Scala中,可以用某种方式对一个数组(或数组缓存)进行转换,这种操作不会修改原数组,而是产生新的数组。如下:



    for(...) yield循环创建了一个类型与原始集合相同的集合。

  • 遍历:使用for循环遍历数组或数组缓冲。如下:

    for (i <- 0 until a.length)
    println(i + ": " + a(i))

    until:返回所有小于上限的数字。

    也可以使用如下方法:

    for (elem <- a)
    println(elem)
  • 多维数组:Scala中多维数组是通过数组的数组实现的。如:Array[Array[Int]],也可以使用ofDim方法。如下:



    第一个是生成10行的二维数组,但列数不确定。

    第二个是生成3*4的二维数组。

在Scala API文档中还有许多关于数组的函数,比如summaxmin等。这里介绍一个mkStringtoString

当需要显示数组或者数组缓冲就可以使用mkString方法,这个方法还可以指定元素之间的分割符。如下:

而对于toString方法,Array只会生成没意义的地址码。ArrayBuffer会被完全转化成String。如下:

映射

  • 构造映射:

    构造不可变映射Map[String,Int],其中的值不能被改变:

    val scores1 = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)
    val scores2 = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))

    构造可变映射

    val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

    构建一个空映射

    val scores = scala.collection.mutable.HashMap[String, Int]

    在Scala中映射是 对偶 的集合,就是用两个值构成一个组。

  • 获取映射值:

    使用()来获取某个键对应的值。如:

    val bobscore = scores("Bob")

    若映射中不包含这个键,将会抛出异常。Scala中可以使用 contains方法判断映射中是否包含某个键。为了防止抛出异常也可以这么做:

    val bobscore = scores.getOrElse("Bob", 0)  //如果没有Bob这个键就返回0
  • 更新映射值:

    可变映射中可以更新映射的值或者添加新的映射关系,做法是在=的左侧使用(),如下:

    scores("Bob") = 10  //更新Bob的值
    scores("xiaoming") = 5  //添加新的键值对

    也可以使用+=来增加多个键值对(如果有相同的键则更新对应的值),用-=来移除某个键值对。如下:



    对于不可变映射,可以使用如下方法对映射进行更新和删除,更新后会生成一个新映射

    val newScores = scores + ("Bob" -> 10, "Freb" -> 7)  //更新
    val newScores = scores - ("Bob" -> 10)   //删除
  • 迭代:

    for((k, v) <- 映射)  处理k和v

    如果只需要访问键或值,则可以用keySetvalues方法。values方法返回一个Iterable,这样就可以在for循环中使用这个'Iterable'。如下:

    scores.keySet  //生成一个类似Set("Bob","Cindy","Fred")这样的集合
    for(v <- scores.values) println(v)  //将打印value值

元组

映射是键值对偶的集合,对偶是元组(tuple)的最简单的形态。元组是不同类型的值的聚集。元组的值是通过将单个的值包括在圆括号中构成。元组的初始化、读取元素和模式匹配的操作如下:



注:其中t._2用来读取元组中的第二个元素。(f,s,_)中的_表示这个位置的元素不需要。

《快学Scala》——数组、映射和元组的更多相关文章

  1. 快学Scala习题解答—第一章 基础

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

  2. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  3. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  4. 快学Scala习题解答—第四章 映射和元组

    4 映射和元组  4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格.然后构建还有一个映射.採用同一组键,可是价格上打9折 映射的简单操作  ,"gun"->18 ...

  5. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  6. Scala的映射和元组操作

    映射和元组操作 构造Map // 构造一个不可变的MAP映射,类似与key -> value这样的组合叫做对偶 val score = Map("Jack" -> 12 ...

  7. 《快学Scala》第四章 映射与元组

  8. 快学Scala习题解答—第三章 数组相关操作

    3 数组相关操作  3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间  random和yield的使用 import scala.math.rando ...

  9. 快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)

    构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, In ...

随机推荐

  1. 关于binary log那些事——认真码了好长一篇

    本文介绍binlog的作用以及几个重要参数的使用方法,同时通过实验来描述binlog内部记录内容:row .statement跟mixed的设置下,记录了哪些东西,最后会简单介绍下binlog ser ...

  2. CSS左侧固定宽 右侧自适应(兼容所有浏览器)

    左侧固定宽,右侧自适应屏幕宽: 左右两列,等高布局: 左右两列要求有最小高度,例如:200px;(当内容超出200时,会自动以等高的方式增高) 要求不用JS或CSS行为实现: 仔细分析试题要求,要达到 ...

  3. linux之date命令详解

    date命令的用处 1.用于显示特殊的时间格式,可以用于对日志文件的命名 2.用于设置时间 ,不过这方面用的比较少,因为一般的服务器都设置的有自动同步网络时间 用法: date [OPTION]... ...

  4. Java核心编程快速学习

    Java核心编程部分的基础学习内容就不一一介绍了,本文的重点是JAVA中相对复杂的一些概念,主体内容如下图所示. 反射reflect是理解Java语言工作原理的基础,Java编译器首先需要将我们编写的 ...

  5. (转)Java线程面试题 Top 50

    原文链接:http://www.importnew.com/12773.html   本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末 ...

  6. Java第二章 变量

    1.什么是变量? 存储数据的基本单位. 2.数据类型分为: 基本类型和引用数据 3.基本数据类型和引用数据类型的区别: 基础数据:不同的变量会分配不同的存储空间,改变一个变量不会影响另一个变量 引用数 ...

  7. Activity栈与任务管理探究1——栈与任务的概述

    Activity栈与任务管理探究1--栈与任务的概述 内容概览 1. 前言 2. Activity中的Stack 3. Activity中的Task 4. Activity栈与任务管理基本原则 1. ...

  8. angularjs实现首页轮播图

    <!DOCTYPE html> <html ng-app="myApp" lang="en"> <head> <met ...

  9. 关闭discuzX3.2注册页面的注册邮箱验证

    论坛升级后发现注册用户在输入任何邮箱email时,一直提示email 地址无效.用firephp跟踪发现:随机生成的email的后缀是@localhost! 找到原因,修改如下: //原来代码 if( ...

  10. RSA加密算法 C++实现

    上信息安全课,老师布置了几个大作业,其中一个为RSA加密算法的实现,不能用Java写.出于兴趣,决定尝试.完成之后,为了便于查找,于是写下这篇文章,以备后续查看.也供大家一起学习,一起进步. 1.预备 ...