龙空技术网

Scala核心编程 数组和元组

研程序笔记 124

前言:

而今朋友们对“javalist集合”大概比较关切,大家都需要知道一些“javalist集合”的相关内容。那么小编在网上网罗了一些有关“javalist集合””的相关资讯,希望兄弟们能喜欢,你们一起来学习一下吧!

纸上得来终觉浅,绝知此事要躬行!

scala集合基本介绍

1)Scala同时支持不可变集合可变集合,不可变集合可以安全的并发访问

2)两个主要的包:

不可变集合:scala.collection.immutable

可变集合: scala.collection.mutable

3)Scala默认采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变(mutable)和不可变(immutable)的版本

4)Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型。

可变集合和不可变集合

1)不可变集合:scala不可变集合,就是这个集合本身不能动态变化。(类似java的数组,是不可以动态增长的)

2)可变集合:可变集合,就是这个集合本身可以动态变化的。(比如:ArrayList , 是可以动态增长的)

Scala不可变集合:继承关系一览图

Scala可变集合:继承关系一览图

小结1:

1.Set、Map是Java中也有的集合2.Seq是Java没有的,我们发现List归属到Seq了,因此这里的List就和java不是同一个概念了3.我们前面的for循环有一个1to3,就是IndexedSeq下的Vector4.String也是属于IndexeSeq5.我们发现经典的数据结构比如Queue和Stack被归属到LinearSeq6.大家注意Scala中的Map体系有一个SortedMap,说明Scala的Map可以支持排序7.IndexSeq和LinearSeq的区别[IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位][LineaSeq是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找,它的价值在于应用到一些具体的应用场景(电商网站,大数据推荐系统:最近浏览的10个商品)

小结2:

1)在可变集合中比不可变集合更加丰富2)在Seq集合中,增加了Buffer集合,将来开发中,我们常用的有ArrayBuffer和ListBuffer3)如果涉及到线程安全可以选择使用syn..开头的集合4)其它的说明参考不可变集合

数组-定长数组(声明泛型)

第一种方式定义数组,这里的数组等同于Java中的数组,中括号的类型就是数组的类型

val arr1 = new Array[Int](10)

//赋值,集合元素采用小括号访问

arr1(1) = 7

第二种方式定义数组,在定义数组时,直接赋值

//使用apply方法创建数组对象

创建:val arr1 = Array(1, 2)

遍历:for(i<-arr1){println(i)}

删除:arr1.remove(0)

修改: arr1(1) =45

数组-变长数组(声明泛型):

创建:val arr2=ArrayBuffer[Int]()

修改: arr2(1) =45 arr2.append(5,3,3)

数组总结:

1) ArrayBuffer是变长数组,类似java的ArrayList

2) val arr2 = ArrayBuffer[Int]() 也是使用的apply方法构建对象

3) def append(elems: A*) { appendAll(elems) } 接收的是可变参数.

4)每append一次,arr在底层会重新分配空间,进行扩容,arr2的内存地址会发生变化,也就成为新的ArrayBuffer

定长数组与变长数组的转换

arr1.toBuffer //定长数组转可变数组

arr2.toArray //可变数组转定长数组

说明:

1)arr2.toArray 返回结果才是一个定长数组, arr2本身没有变化

2)arr1.toBuffer返回结果才是一个可变数组, arr1本身没有变化

数组-多维数组

多维数组的定义和使用:说明定义

val arr = Array.ofDim[Double](3,4)

//说明:

1.arr 是一个二维数组

2.有三个元素[一维数组]

3.每个一维数组存放4个值

//赋值,修改

arr(1)(1) = 11.11

遍历

方法1:for (i <- 0 to array1.length - 1) {  for (j <- 0 to array1(i).length - 1) {    printf("arr[%d][%d]=%d\t", i, j, array1(i)(j))  }  println()}
方法2:for (item <- array1) {//取出一维数组    for (item2 <- item) {//遍历一维数组        print(item2 + "\t")    }    println()}

数组-Scala数组与Java的List的互转

Scala数组转Java的List

在项目开发中,有时我们需要将Scala数组转成Java数组,看下面案例:

// Scala集合和Java集合互相转换val arr = ArrayBuffer("1", "2", "3")//隐式转换import scala.collection.JavaConversions.bufferAsJavaListval javaArr = new ProcessBuilder(arr)val arrList = javaArr.command()println(arrList)

Java的List转Scala数组(mutable.Buffer)

在项目开发中,有时我们需要将Java的List转成Scala数组,看下面案例:

import scala.collection.JavaConversions.asScalaBufferimport scala.collection.mutable// java.util.List ==> Bufferval scalaArr: mutable.Buffer[String] = arrListscalaArr.append("jack")println(scalaArr)

元组Tuple-元组的基本使用

基本介绍:元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组, 最大的特点灵活,对数据没有过多的约束。

注意:元组中最大只能有22个元素

元组的创建

val tuple1 = (1, 2, 3, "hello", 4)

对代码的说明1)t1的类型是Tuple5类是scala特有的类型

2)t1的类型取决于t1后面有多少个元素,有对应关系,比如4个元素=》Tuple4

3)给大家看一个Tuple5类的定义,大家就了然了/*finalcaseclassTuple5[+T1,+T2,+T3,+T4,+T5](_1:T1,_2:T2,_3:T3,_4:T4,_5:T5)extendsProduct5[T1,T2,T3,T4,T5]{overridedeftoString()="("+_1+","+_2+","+_3+","+_4+","+_5+")"}*/

4)元组中最大只能有22个元素即Tuple1...Tuple22

元组Tuple-元组数据的访问

基本介绍:访问元组中的数据,可以采用顺序号(_顺序号),也可以通过索引(productElement)访问。

println(tuple1 ._1) //访问元组的第一个元素 ,从1开始

println(t1.productElement(0)) // 访问元组的第一个元素,从0开始

Tuple是一个整体,遍历需要调其迭代器,遍历:

for (item <- tuple1.productIterator){ println(item)}

学习使人进步,共勉!加油!

标签: #javalist集合