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) / ...
随机推荐
- 14.链表中倒数第k个结点 Java
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 快指针和慢指针,快指针先跑K个单位然后慢指针开始跑,快指针跑到最后一个节点的时候慢指针对应的就是链表中倒数第k个结点 public stat ...
- 剑指offer21----数组中奇数偶数
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 基本实现 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- maven坐标及依赖范围的学习(1)
首先,我们先了解什么是maven的坐标(重中之重): 在这里我们可以看到那三个红色的行,基本是pom.xml中出现的最多的配置 例如这个配置:这里我们可以看到我们这个项目的pom文件中,他对名 ...
- Flutter移动电商实战 --(11)首页_屏幕适配方案和制作
1.flutter_ScreenUtil插件简介 flutter_ScreenUtil屏幕适配方案,让你的UI在不同尺寸的屏幕上都能显示合理的布局. 插件会让你先设置一个UI稿的尺寸,他会根据这个尺寸 ...
- 微信小程序之状态管理A
其实这个标题 不是很对 主要是最近小程序项目中 有这么一个状态 所有商品都共用一个商品详情页面 大概就是这样子 为了公司 保险起见,一些展示的内容已经处理 但是无伤大雅 就是这么两个按钮 左侧粉色 ...
- 基于eclipse的java与mysql开发环境的搭建
本文主要介绍 Java与MySQL的连接 1.安装jdk 略~ 园子里有很多 2.安装mysql 略~ 3.下载并安装JDBC,通过mysql官网下载 http://dev.mysql.com/d ...
- <javaScript>谈谈JavaScript中的变量、指针和引用
1.变量我们可能产生这样一个疑问:编程语言中的变量到底是什么意思呢?事实上,当我们定义了一个变量a时,就是在存储器中指定了一组存储单元,并将这组存储单元命名为a.变量a的值实际上描述的是这组存储单元中 ...
- 保存图片控件上的图片到本地 出现错误:无法将类型为“System.Windows.Media.Imaging.BitmapFrameDecode”的对象强制转换为类型“System.Windows.Media.Imaging.BitmapImage”。
保存图片控件上的图片到本地 出现错误:无法将类型为“System.Windows.Media.Imaging.BitmapFrameDecode”的对象强制转换为类型“System.Windows.M ...
- nginx的负载均衡和反向代理
本文介绍一些负载均衡和反向代理的一些基本概念,然后介绍如何基于nginx实现,包括两种安装nginx的方法:yum安装和源码安装,以及ngix该如何配置等. 什么是负载均衡? 概念 负载均衡是高可用网 ...
- How to remove duplicate lines in a large text file?
How would you remove duplicate lines from a file that is much too large to fit in memory? The dupli ...