Scala学习三——数组相关操作
一.若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer
固定长度数组:
如val nums=new Array[Int](10) //10个整型数组,所有元素初始化为0;
val a=new Array[String](10) //10个元素的字符串数组,所有元素为null
变长数组:
ArrayBuffer(相当于Java中的ArrayList)
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(11,7,8,9,6,2)
//可以插入任意多的元素
b.remove(2)
//ArrayBuffer(1,1,8,9,6,2)
b.remove(2,3)
//ArrayBuffer(1,1,2)
//第二个参数的含义是移除多少个元素
b.toArray()//数组缓冲转换为固定长度数组
a.toBuffer()//固定长度转换为数组缓冲
二.提供初始值时不要使用new
val s=Array("Hello","World")长度为2的Array(String),已经提供初始值就不需要new
三.用()来访问元素
注意使用()来访问元素,而不是[]
四.用for(elem<-arr)来遍历元素
for(i<- 0 until a.length)...:util是RichInt类的方法,返回所有小于(不包括)上限的数字(o until 10实际调用的是0.until(10))。
每两个元素一跳(0 util (a.length,2));
从数组尾端开始:(0 until a.length).reverse;
如果在循环体中不需要用到数组下标,直接访问元素for(elem<-a)
五.用for(elem<-arr if...)...yiels...来将原数组转型为新数组
例子:
val a=Array(2,3,5,7,11)
val result= for (elem-<a) yield 2*elem
//result为Array(4,6,10,14,22)
注:for(...)yield创建的是一个类型与原始集合相同的新集合;
常用算法,Array(1,2,3).sum/min/max,Array(22,4,5,1).sorted(_<_)[从小到大],Array(22,4,5,1).sorted(_>_)[从大到小]
六.Scala数组和Java数组可以互操作;用ArrayBuffer,使用scala.collection.JavaConversions中的转换函数
多维数组创建:
val matrix=Array.ofDim[Double](3,5)//三行四列
使用scala.collection.JavaConversions转换案例:
七.练习
1.
import scala.util.Random
def main (args: Array[String]) {
createArr(10).foreach(println)
}
def createArr(n:Int):Array[Int]={
val arr=new Array[Int](n)
val rand=new Random()
for(ele <- arr)
yield rand.nextInt(n)
}
2.
def main(args: Array[String]) = {
val arr=Array(1,2,3,4,5)
swap(arr)
arr.foreach(print) }
def swap(arr:Array[Int]):Unit={
for(i<-0 until(arr.length-1,2)){
val tmp=arr(i)
arr(i)=arr(i+1)
arr(i+1)=tmp
}
3.
def main(args: Array[String]) = {
val arr1 = Array(1, 2, 3, 4, 5)
val arr2 = swapByYield(arr1)
arr2.foreach(print)
} def swapByYield(arrs: Array[Int]) = {
for (i <- 0 until arrs.length) yield {
if (i < arrs.length - 1 && i % 2 == 0) {
val tmp = arrs(i)
arrs(i) = arrs(i + 1)
arrs(i + 1) = tmp
}
}
arrs
}
4.
def main(args: Array[String]) = {
val a = Array(1, -2, 0, -3, 1, 2)
val b = sigArr(a)
b.foreach(println)
} def sigArr(arr: Array[Int]) = {
val buff = new ArrayBuffer[Int]()
buff ++= (for (i <- arr if i > 0) yield i)
buff ++= (for (i <- arr if i == 0) yield i)
buff ++= (for (i <- arr if i < 0) yield i)
buff.toArray
}
5.
def main(args: Array[String]) = {
val a = Array[Double](1, 4, 2, 10, 3, -1, -3)
val b = Avgarr(a)
println(b)
} def Avgarr(arr: Array[Double]) = {
arr.sum / arr.length
}
6.
def main(args: Array[String]): Unit = {
val arr1 = Array(5, 4, 3, 2, 1)
reverseArray(arr1)
arr1.foreach(print)
print("\n")
val arr2 = ArrayBuffer(5, 4, 3, 2, 1)
reverseArrayBuffer(arr2).foreach(print)
} /**
* Array反序排列(注:Array长度不可变)
*
* @param arr
*/
def reverseArray(arr: Array[Int]) = {
for (i <- 0 until arr.length / 2) {
val tmp = arr(i)
arr(i) = arr(arr.length - 1 - i)
arr(arr.length - 1 - i) = tmp
}
} def reverseArrayBuffer(arr: ArrayBuffer[Int]) = {
val reverseArr = ArrayBuffer[Int]()
reverseArr++= arr.reverse
reverseArr
}
7.
def main(args: Array[String]): Unit = {
val arr1=ArrayBuffer(1,2,3,3,4,4,5,1,6,7)
val arr2=ArrayBuffer[Int]()
arr2++=arr1.distinct
arr2.foreach(print)
}
8.
def main(args: Array[String]): Unit = {
val arr=Array(-1,2,3,-4,-5)
val arr2=proResult(arr)
arr2.foreach(print)
}
def proResult(arr:Array[Int])={
val indexs=for(i <- 0 until arr.length if arr(i)<0) yield i
val afterDropIndexs=indexs.reverse.dropRight(1)
val tmp=arr.toBuffer
for(i<-afterDropIndexs) tmp.remove(i)
tmp
}
9.
def main(args: Array[String]): Unit = {
val arr=timeTone
arr.foreach(print)
}
def timeTone={
val arr=java.util.TimeZone.getAvailableIDs()
val tmp=for(i<-arr if i.startsWith("America/")) yield{i.drop("America/".length)}
scala.util.Sorting.quickSort(tmp)
tmp
}
10.
def main(args: Array[String]): Unit = {
val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
println(flavors.getClass.getSimpleName)
}
Scala学习三——数组相关操作的更多相关文章
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
- 快学Scala习题解答—第三章 数组相关操作
3 数组相关操作 3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间 random和yield的使用 import scala.math.rando ...
- Scala学习(三)练习
Scala数组相关操作&练习 1. 1. 编写一段代码,将a设置为一个包含n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 def main (args: Array[Strin ...
- scala 入门(2)--数组相关操作
scala 无论从数组的定义还是操作方面来说都跟java非常相似,但又有其独特的强大之处… 1. 定长数组 对于长度不变的数组,可以用scala中的Array. //scala 里使用new实例化对象 ...
- JavaScript基础学习(三)—数组
一.数组简介 JavaScript数组的每一项都可以保存任何类型的数据,也就是说数组的第一个位置保存字符串,第二个位置可以保存数值,第三个位置可以保存对象,而且数组的大小是可以动态调整的,即可 ...
- scala 对一个数组分组操作
通常我们有一些需求,对一个数组两两进行翻转,通常就涉及到奇数偶数,否则就会出现数组index异常了,所以我们该怎么办呢? 虽然是一个入门级问题,但是我还是觉得这是一个很有意思的题目,因此写了一个对于通 ...
- 《快学Scala》第三章 数组相关操作
- [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组
1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...
- 快学Scala-第三章 数组相关操作
知识点: 1.定长数组 Array val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new Array[String](10) / ...
随机推荐
- MySQL优化相关参数--先做个记录,以后可能用得到
innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...
- Google 插件的使用
每次看英文网页或者文档的时候总会碰到不认识单词,就想能不能选中单词就可以显示翻译?于是就安装Google浏览器的翻译插件,总的来说,蛮繁琐的. 1.先安装谷歌访问助手 (1.)直接百度谷歌访问助手 ( ...
- 性能分析 | JVM发生内存溢出的8种原因及解决办法
推荐阅读:史上最详细JVM与性能优化知识点综合整理 1.Java 堆空间 2.GC 开销超过限制 3.请求的数组大小超过虚拟机限制 4.Perm gen 空间 5.Metaspace 6.无法新建本机 ...
- Django之通用视图
01-介绍 通用视图把视图开发中常用的写法和模式抽象出来,让你编写少量代码就能快速实现常见的数据视图.显示对象列表就是这样一种任务. Django 自带的通用视图能实现下述功能: 1.列出对象并显示单 ...
- Linux 查看 MySQL的版本信息
Linux 查看 MySQL的版本信息 如何查看某台 Linux 主机上的 安装的 MySQL版本信息? 使用如下命令,查看 MySQL的版本信息: mysql -V 或者 mysql --versi ...
- MongodDB基本命令
MongoDB基本命令 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show co ...
- 【JVM学习笔记】异常表的重要作用以及locals属性的含义
有如下代码 public class Test { public void work() { try { InputStream is = new FileInputStream("test ...
- vue弹窗后如何禁止滚动条滚动?
原文地址 常见场景 在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目.有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-inde ...
- 抄录的Linux命令
daemon daemon 有一个很高大上的中文名字,叫 守护进程 . 有句话是这么说的,如果 Unix 中没有了守护进程,那么 Unix 就不会是相同的. 它很有个性,是一个运行在后台且不受终端控制 ...
- webdriver的八种定位
转自https://zhuanlan.zhihu.com/p/54588889 在UI层面的自动化测试开发中,元素的定位与操作是基础,也是经常遇到的困难所在.webdriver提供了8种定位: 1. ...