关闭

[Scala]Scala学习笔记二 数组

标签: scala数组基础
336人阅读 评论(0) 收藏 举报
分类:

1. 定长数组

如果你需要一个长度不变的数组,可以使用Scala中的Array.

val nums = new Array[Int](10) // 10个整数的数组 所有元素初始化为0
val strs = new Array[String](10) // 10个字符串的数组 所有元素初始化为null
val s = Array("Hello", "World") // 长度为2的Array[String] 类型是推断出来的 
s(0) = "GoodBye" // Array("GoodBye","World")

备注

已提供初始值时不要使用new,例如上面的数组s

使用()而不是[]来访问元素

在JVM中,Scala的Array以Java数组方式实现.

2. 变长数组

对于那种长度按需要变化的数组,Java有ArrayList.Scala中等效数据结构为ArrayBuffer.

import scala.collection.mutable.ArrayBuffer
val b = ArrayBuffer[Int]() // 或者 new ArrayBuffer[Int]() 创建一个空的数组缓冲来存放整数\
b += 1 // ArrayBuffer(1) 用+=在尾端添加元素
b += (1,2,3,5) // ArrayBuffer(1,1,2,3,5) 在尾端添加多个元素
b ++= Array(8, 13, 21) // ArrayBuffer(1,1,2,3,5,8,13,21) 用++=操作追加任何集合
b.trimEnd(5) // ArrayBuffer(1,1,2) 移除最后5个元素

可以在任意位置插入或移除元素,但这样的操作不如在尾端添加或移除元素操作那么高效:

b.insert(2,6) // ArrayBuffer(1,1,6,2) 在下标2之前插入
b.insert(2,7,8,9) // ArrayBuffer(1,1,7,8,9,6,2) 插入任意多的元素
b.remove(2) // ArrayBuffer(1,1,8,9,6,2) 删除下标2的元素
b.remove(2,3) // ArrayBuffer(1,1,2) 第二个参数的含义是要移除多少个元素

有时需要构建一个Array,但不知道最终需要装多少元素.这种情况下可以先构建一个数组缓冲,然后调用:

b.toArray // Array(1,1,2)

3. 遍历数组和数组缓冲

使用for循环遍历数组和数组缓冲:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until b.length){
  println(i + "-" + b(i))
}

输出结果:

0-6
1-5
2-4
3-3
4-2
5-1

备注

until 是RichInt类的方法,返回所有小于(但不包括)上限的数字

如果想要每两个元素一跳,可以让i这样来进行遍历:

val b = Array(6,5,4,3,2,1)
for(i <- 0 until (b.length, 2)){
  println(i + "-" + b(i))
}

输出结果:

0-6
2-4
4-2

如果要从数组的尾端开始:

val b = Array(6,5,4,3,2,1)
for(i <- (0 until b.length).reverse){
  println(i + "-" + b(i))
}

如果在循环体中不需要用到数组下标,我们也可以直接访问数组元素:

for(elem <- b){
  println(elem)
}

4. 数组转换

从一个数组(数组缓冲)出发,以某种方式对它进行转换是很简单的.这些转换操作不会修改原是数组,而是产生一个全新的数组:

val a = Array(1,2,3,4)
val result = for(elem <- a) yield 2 * elem // resultArray(2,4,6,8)

for(...) yield循环创建了一个类型与原实际和相同的新集合.新元素为yield之后的表达式的值,每次迭代对应一个.

当你遍历一个集合时,如果只想处理满足特定条件的元素.可以通过for中的if来实现:

val a = Array(1,2,3,4)
val result = for(elem <- a if elem % 2 == 0) yield 2 * elem

上面实例中对每个偶数元素翻倍,并丢掉奇数元素.

5. 常用操作

5.1 sum

val a = Array(6,1,7,4)
a.sum // 18

要使用sum方法,元素类型必须是数值类型:整型,浮点数或者BigInteger/BigDecimal

5.2 min max

val a = Array(6,1,7,4)
a.min // 1
a.max // 7

min和max输出数组或数组缓冲中最小和最大的元素

5.3 sorted

val a = Array(6,1,7,4)
val asorted = a.sorted // Array(1, 4, 6, 7)

val a = ArrayBuffer(6,1,7,4)
val asorted = a.sortWith(_ > _) // ArrayBuffer(7, 6, 4, 1)

sorted方法将数组或数组缓冲排序并返回经过排序的数组或数组缓冲,不会修改原始数组.可以使用sortWith方法提供一个比较函数.

5.4 mkString

val a = Array(6,1,7,4)
a.mkString(" and ") // 6 and 1 and 7 and 4

如果想要显示数组或者数组缓冲的内容,可以使用mkString,允许指定元素之间的分隔符

val a = Array(6,1,7,4)
a.mkString("<", ",", ">") // <6,1,7,4>
该方法的另一个重载版本可以让你指定前缀和后缀
1
0
查看评论

Scala学习笔记1 - 基础

本文档针对scala 2.10.x,由于scala目前发展迅速,因此可能会和其他版本的不同。 ===概述          scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结...
  • guohecang
  • guohecang
  • 2016-08-04 11:47
  • 751

SCALA学习笔记(一)

变量 获取变量的值是一个耗时的工作时,可以考虑使用lazy var. lazy val forLater = someTimeConsumingOperation() scala> val first :: rest = List(1, 2, 3) first: Int = 1...
  • bluishglc
  • bluishglc
  • 2015-02-27 08:46
  • 23541

scala 数组详解

1.初始化数组想要初始化数组,可以跟java里面一样,使用new关键字,指定数据类型与数组长度。 def test() = { val arr = new Array[Int](3) arr.foreach(x => print(x + ",&q...
  • bitcarmanlee
  • bitcarmanlee
  • 2017-06-17 11:35
  • 408

Scala 数组

一  Array 数组 在Scala中,Array代表的含义和Java中类似,也是长度不可变的数组 此外,由于Scala与Java都运行在JVM中,双方可以互相调用,因此 Scala数组的底层实际上是Java数组。例如字符串数组在底层就是 javaString[],整数数组在底层就...
  • zhanglh046
  • zhanglh046
  • 2016-12-21 15:20
  • 1119

scala自学日记(6)-数组的初始化以及循环

1.scala里面的数组和java里面的比较类似,但是又有些不同,数组的初始化方法比java里面多了一种方式,具体如下: 代码如下: package com.scala.demo /** * 这里主要介绍数组的使用 */ object ArrayDemo2 { val array=...
  • y3wegy
  • y3wegy
  • 2012-09-27 16:26
  • 15966

Scala的学习笔记_第一天

以一次接触Scala,记下的部分笔记,内容还会持续的更新,学习.
  • Abandon_Sun
  • Abandon_Sun
  • 2017-07-25 21:41
  • 209

Scala变长数组简单操作

直接上代码 注意until和to的区别 import scala.collection.mutable.ArrayBuffer object ArrayDemo { /*def main(args: Array[String]): Unit = { val a = new Arra...
  • Dr_Guo
  • Dr_Guo
  • 2016-04-10 19:03
  • 2740

Scala多维数组、Java数组与Scala数组的隐式转换

多维数组:数组的元素,还是数组,数组套数组,就是多维数组 构造指定行与列的二维数组:Array.ofDim方法 val multiDimArr1 = Array.ofDim[Double](3, 4) multiDimArr1(0)(0) = 1.0 构造不规则多维数组: val ...
  • qq_39532946
  • qq_39532946
  • 2017-08-31 15:06
  • 427

Scala数组操作

数组要点 若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer;提供初始值时不要使用new;用()来访问元素;用for(elem 例子: import scala.collection.mutable.ArrayBuffer; object HelloWorld { ...
  • shijiebei2009
  • shijiebei2009
  • 2014-08-16 16:33
  • 28473

Scala中数组的创建及实例化

Scala创建以及实例化的方式: //创建一个长度为3的字符串数组,并逐个赋值,然后打印输出结果 val greetStrings = new Array[String](3) greetStrings(0)="Hello" greetStrings(1)=",&qu...
  • u011740475
  • u011740475
  • 2014-11-25 10:28
  • 2200
    个人资料
    • 访问:1517585次
    • 积分:22609
    • 等级:
    • 排名:第378名
    • 原创:624篇
    • 转载:133篇
    • 译文:60篇
    • 评论:189条
    博客专栏
    文章分类
    最新评论