Array

与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组。

注意:访问数组中元素使用()而不是Java中的 []

  1. scala> val a = new Array[String](10)
  2. a: Array[String] = Array(null, null, null, null, null, null, null, null, null, n
  3. ull)
  4. scala> val a = new Array[Boolean](10)
  5. a: Array[Boolean] = Array(false, false, false, false, false, false, false, false
  6. , false, false)
  7. scala> a(0)
  8. res15: Boolean = false
  9. scala> val a = new Array[Int](10)
  10. a: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
  11. scala> a(0) = 1



可以直接使用Array()创建数组,元素类型自动推断(如果类型不一致则为公共父类型

  1. scala> val a = Array("Hello", "World")
  2. a: Array[String] = Array(Hello, World)
  3. scala> val a = Array("Sparks", 30)
  4. a: Array[Any] = Array(Sparks, 30)
  5. // 常见操作
  6. scala> val a = Array(3,4,1,2,5,3)
  7. a: Array[Int] = Array(3, 4, 1, 2, 5, 3)
  8. scala> val sum = a.sum
  9. sum: Int = 18
  10. scala> val max = a.max
  11. max: Int = 5
  12. scala> scala.util.Sorting.quickSort(a)
  13. scala> a
  14. res35: Array[Int] = Array(1, 2, 3, 3, 4, 5)
  15. scala> a.mkString
  16. res36: String = 123345
  17. scala> a.mkString(",")
  18. res37: String = 1,2,3,3,4,5
  19. scala> a.mkString("<",",",">")
  20. res38: String = <1,2,3,3,4,5>
  21. // Array的toString有些问题
  22. scala> a.toString
  23. res39: String = [I@ffd26d1
  24. scala> b.toString
  25. res40: String = ArrayBuffer(1, 6, 7, 8, 9, 10)

ArrayBuffer

类似于Java中的ArrayList长度可变集合类

  1. scala> import scala.collection.mutable.ArrayBuffer
  2. import scala.collection.mutable.ArrayBuffer
  3. scala> val b = ArrayBuffer[Int]()
  4. b: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
  5. // 使用+=添加一个或者多个元素,spark源码中大量使用!!!
  6. scala> b += 1
  7. res17: b.type = ArrayBuffer(1)
  8. scala> b += (2,3,4,5)
  9. res18: b.type = ArrayBuffer(1, 2, 3, 4, 5)
  10. // 使用++=添加其他集合中的所有元素
  11. scala> b ++= Array(6, 7, 8, 9, 10)
  12. res19: b.type = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  13. // trimEnd方法可以从尾部截断指定个数的元素
  14. scala> b.trimEnd(5)
  15. scala> b
  16. res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
  17. // 使用insert()函数可以在指定位置插入一个或者多个元素,效率较低
  18. scala> b.insert(5,6)
  19. scala> b.insert(6, 7, 8, 9, 10)
  20. scala> b
  21. res24: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  22. // 使用remove()函数可以移除指定位置的一个或者多个元素
  23. scala> b.remove(1)
  24. res25: Int = 2
  25. scala> b.remove(1, 3)
  26. scala> b
  27. res27: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 6, 7, 8, 9, 10)
  28. // Array与ArrayBuffer互相转化
  29. scala> b.toArray
  30. res28: Array[Int] = Array(1, 6, 7, 8, 9, 10)
  31. scala> a.toBuffer
  32. res29: scala.collection.mutable.Buffer[Any] = ArrayBuffer(Sparks, 30)

遍历Array和ArrayBuffer

  1. 使用until是RichInt提供的函数

    for (i <- 0 until b.length)

    print(b(i))

  2. 跳跃遍历,步进长度

    for (i <- 0 until (b.length, 2))

    print(b(i))

  3. 从尾部遍历

    for (i <- (0 until b.length).reverse)

    println(b(i))

  4. 使用“增强for循环”遍历

    for (e <- b)

    println(e)

数组操作之数组转换

1.使用yield

  1. scala> val a = Array(1,2,3,4,5)
  2. a: Array[Int] = Array(1, 2, 3, 4, 5)
  3. scala> val a2 = for(ele <- a) yield ele*ele
  4. a2: Array[Int] = Array(1, 4, 9, 16, 25)
  5. scala> val a = ArrayBuffer(1,2,3,4,5)
  6. a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5)
  7. scala> val a2 = for(ele <- a) yield ele*ele
  8. a2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 4, 9, 16, 25)

2.使用函数式编程

_ 表示通配符

  • a.filter(_ % 2 == 0).map(2 * _) (推荐方式)
  • a.filter{ _ % 2 == 0} map {2 * _}

实战:移除第一个负数之后的所有负数

  1. // 构建数组
  2. scala> val a = ArrayBuffer[Int]()
  3. a: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
  4. scala> a += (1,2,3,4,5,-1,-3,-5,-9)
  5. res45: a.type = ArrayBuffer(1, 2, 3, 4, 5, -1, -3, -5, -9)
  6. // 发现第一个负数之后的负数,就进行移除,性能较差,多次移动数组
  7. var foundFirstNegative = false
  8. var index = 0
  9. while(index < a.length) {
  10. if (a(index) >= 0) {
  11. index += 1
  12. }
  13. else {
  14. if (!foundFirstNegative) {foundFirstNegative=true; index += 1}
  15. else { a.remove(index)}
  16. }
  17. }
  18. //检索出所有需要元素的下标,然后将所有需要的元素左移至数组左侧,删除右侧不需要的元素。
  19. //改良版,性能较高
  20. var foundFirstNegative = false
  21. val vaildIndex = for (i <- 0 until a.length if (!foundFirstNegative || a(i) >= 0)) yield {
  22. if (a(i) < 0) foundFirstNegative = true
  23. i
  24. }
  25. for(i <- 0 until vaildIndex.length) {a(i) = a(vaildIndex(i))}
  26. a.trimEnd(a.length - vaildIndex.length)

Scala入门系列(三):数组的更多相关文章

  1. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  2. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  3. mybatis入门系列三之类型转换器

    mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...

  4. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  5. Scala入门系列(十二):隐式转换

    引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...

  6. Scala入门系列(十三):类型参数

    引言 Scala中类型参数是什么呢?其实就类似于Java中的泛型.定义一种类型参数,比如在集合.类.函数中定义类型参数,然后就可以保证使用到该类型参数的地方就只能是这种类型,从而实现程序更好的健壮性. ...

  7. ES6入门系列三(特性总览下)

    0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...

  8. Scala入门系列(四):Map & Tuple

    Map 创建Map // 创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Sparks" -> ...

  9. Scala入门系列(十一):模式匹配

    引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...

随机推荐

  1. Rails 自定义验证的错误信息

    Active Record 验证辅助方法的默认错误消息都是英文,为了提高用户体验,有时候我们经常会被要求按特定的文本展示错误信息.此时有两种实现方式. 1. 直接在:message添加文案 class ...

  2. C++引用的用处

    原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755864.html 一.什么是“引用”?声明和使用“引用”要注意哪些问题? 答:引用就 ...

  3. JavaWeb基础—MVC与三层架构

    一.MVC的概念 MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  4. 【转】比较详细的Asp伪静态化方法及Asp静态化探讨

    目前,各大搜索引擎如google.百度.雅虎已经对动态页面诸如asp,php有着不错的支持了,只要动态页面后面的参数不要太长,如控制在3个参数内,页面内容做点优化,各大搜索对该类页面收录甚至不比静态h ...

  5. java.util.Arrays.asList 的小问题

    JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util. ...

  6. Python之闭包函数、装饰器

    1.闭包函数 #作用域关系在函数定义阶段时就已经固定死了,与调用位置无关 # 即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系 # def f1(): # x=1 # def inner(): ...

  7. Python无参装饰器

    需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func(): return 'test_func' def test_ ...

  8. C#四则运算器(多态方法实现)

    在上一节C#课上,我们学习了用类的继承的方式来做一个四则运算器,然而老师的代码在课上演示的效果并不理想,而且没有使用多态的思想实现,今天我们就来用多态的方式实现四则运算器. 1. 题目及要求 2. A ...

  9. 【LeetCode算法题库】Day4:Regular Expression Matching & Container With Most Water & Integer to Roman

    [Q10] Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  10. IEEE1588 verision 2 报文介绍

    PTP 报文 PTP verision 2 报文是由 报头 / header,主体 / body 和 报尾 / suffix 组成,报尾长度可能为 0 ; PTP verision 2 报文在 ver ...