博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala数组
阅读量:5079 次
发布时间:2019-06-12

本文共 2901 字,大约阅读时间需要 9 分钟。

在scala中的数组和JAVA中的数组都是定长的,一旦初始化就不可改变(Scala数据底层是直接变成JAVA的数组)

Array

定义即初始化,并分配空间

//声明类型和长度 val arr = new Array[Int](10)arr: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)//直接使用构造函数构建(调用apply函数) val arr1 = Array("123", 1)arr1: Array[Any] = Array(123, 1)

ArrayBuffer(JAVA无):由ArrayList实现?

类似于JAVA中的ArrayList(ArrayList数组实现,每次中间插入删除慢,而LinkedList[火车]由对象实现,查找慢),变长数组

1.定义

import scala.collection.mutable.ArrayBuffervar arrBuf = ArrayBuffer[Int]()arrB: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

2.写入

// 尾部追加 += **奇葩语法又来了**,其实就是定义了+=函数arrBuf += 1arrBuf += (1,2,3,4,5,6)//追加整个数组arrBuf ++= Array(1,2,3)//源码def +=:(elem: A): this.type = {def ++=:(xs: TraversableOnce[A]): this.type = {//指定位置追加(index,args: _*)arrBuf.insert(3,args)

3.删除

//尾部删除,删除指定长的元素arrBuf.trimEnd(3)//指定位置删除(index,lenth)arrBuf.remove(2)arrBuf.remove(2,3)

Array和ArrayBuffer转换

B.toArray()A.toBuffer()

数组遍历

  • arr[]
  • arrBuf()

1.增强for循环

for (e <- arrBuf){    println(e)}

2.for until(无上界限)

//for (i <- arrBuf.indices){            //新API//全遍历(从0开始)for (i <- 0 until arrBuf.length){  println(arrBuf(i))}//基数遍历(从0开始)for (i <- 0 until (arrBuf.length,2)){  println(arrBuf(i))}//偶数遍历(从1开始)for (i <- 1 until (arrBuf.length,2)){  println(arrBuf(i))}//逆序(新API)for (i <- arrBuf.indices.reverse){  println(arrBuf(i))}

常见操作

//求和arr.sum//最大,最小arr.maxarr.min//克隆arr.clone()//排序util.Sorting.quickSort(arr)//mkstring(组装字符串)arr.mkString                //res0: String = 56783456arr.mkString(",")           //res1: String = 5,6,7,83,4,5,6arr.mkString("<",",",">")   //res2: String = <5,6,7,83,4,5,6>//toStringarr.toString                //res0: String = [I@6f8cf218//hashCodearr.hashCode()              //res0: Int = 1556830203

使用yield和函数式编程实现数组转换

yield转换

//转换后类型与原类型相同,原值不变for (a <- arr) yield a*a//增减if守护过滤for (a <- arr if a%2 == 0) yield a*a

函数式编程

//使用filter作为过滤器arr.filter(_ % 2 == 0).map(_ * 2)       // _表示占位符,第一个表示Array里的每一个元素,第二个表示过滤后的一个元素//可以将()变成{},不常用arr.filter{_ % 2 == 0}.map{_ * 2}

算法实战

import scala.collection.mutable.ArrayBuffer/*删除第一个负数之后的负数 */var arr = ArrayBuffer[Int](1, 2, 3, 4, -1, -2, -4, 5)var foundFirstNegative = falsevar index = 0var arr_length = arr.length不可以用for因为删了就少了,就会出现以后的几遍就不能比较了//for (i <- arr.indices) {//  if (arr(i) > 0) {/*//低效率版,remove频繁移动数组,当数组全是负数时,复杂度为O((n+n^2)/2)while (index < arr_length) {  if (arr(index) > 0) {    index += 1  } else {    if (foundFirstNegative) {      arr.remove(index)      arr_length -= 1    } else {      foundFirstNegative = true      index += 1    }  }}arr.mkString*///高效率版,把留下的index做标志,一次性删除其他的,最坏的情况,复杂度为O(n)//这里的if守卫,刚开始的时候都能放行,当找到第一个负数之后就把别的负数拦在门外了val keepIndexArr = for (i <- arr.indices if !foundFirstNegative || arr(i) >= 0) yield {  if (arr(i) < 0) {    foundFirstNegative = true  }  i}//先装for (i <- keepIndexArr.indices) {  arr(i) = arr(keepIndexArr(i))}//后删arr.trimEnd(arr_length - keepIndexArr.length)print(arr.mkString)

转载于:https://www.cnblogs.com/cenzhongman/p/7453366.html

你可能感兴趣的文章
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>
常见的js算法面试题收集,es6实现
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Windows10 下Apache服务器搭建
查看>>
HDU 5458 Stability
查看>>
左手坐标系和右手坐标系
查看>>
solr后台操作Documents之增删改查
查看>>
http://yusi123.com/
查看>>
文件文本的操作
查看>>
Ubuntu linux下gcc版本切换
查看>>
记一次Web服务的性能调优
查看>>
jQuery.form.js使用
查看>>
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
mysql数据增删改查
查看>>