scala系列(二)数组与列表操作
- 二、数组与列表操作
- (一)数组操作
- 1. 定长数组
- 2. 变长数组
- 3. 数组遍历
- 4. 数组转换
- 5. 数组操作中的常用算法
- 6. ArrayBuffer Scaladoc解析
- 7. 多维数组
- (二)列表List操作
- 1. List类型定义及List的特点
- 2. List常用构造方法
- 3. List常用操作
- 4. List伴生对象方法
二、数组与列表操作
(一)数组操作
1. 定长数组
def main(args: Array[String]): Unit = { // 定长数值数组,默认都为0 var a1 = new Array[Int](3); a1(1) = 2312; for(i <- a1)println(i); // 定长字符串数组,默认都为null var a2 = new Array[String](3); for(i <- a2)println(i); // 其它声明方式 var a3 = Array(1,3,4); // 不同类型元素的数组 var a4 = Array("sdf",3,4); println(a4.getClass); for(i <- a4)println(i+":"+i.getClass()); } |
0 2312 0 null null null class [Ljava.lang.Object; sdf:class java.lang.String 3:class java.lang.Integer 4:class java.lang.Integer |
2. 变长数组
def main(args: Array[String]): Unit = { var arrayInt = ArrayBuffer(1,2,3); for(i<- arrayInt)print(i); // 插入元素 println(); arrayInt.insert(0, -1,-2); for(i<- arrayInt)print(i); // 删除元素 println(); arrayInt.remove(0, 3); for(i<- arrayInt)print(i); // 转成定长数组 println(); var a3 = arrayInt.toArray; for(i<- a3)print(i); } |
123 -1-2123 23 23 |
3. 数组遍历
def main(args: Array[String]): Unit = { var arrayInt = ArrayBuffer(1,2,3,4,5,6); // to for(i<- 0 to arrayInt.length-1)print(arrayInt(i)+","); println(); // until for(i<- 0 until arrayInt.length)print(arrayInt(i)+","); println(); // 数组方式 for(i<- arrayInt)print(i+","); println(); // 步长为2 for(i<- 0 to (arrayInt.length-1,2))print(arrayInt(i)+","); println(); } |
1,2,3,4,5,6, 1,2,3,4,5,6, 1,2,3,4,5,6, 1,3,5, |
4. 数组转换
yield关键字的简短总结
1) 针对每一次 for 循环的迭代, yield 会产生一个值,被循环记录下来 (内部实现上,像是一个缓冲区).
2) 当循环结束后, 会返回所有 yield 的值组成的集合.
3) 返回集合的类型与被遍历的集合类型是一致的.
// 数组转换 yield(当成是一个动词,生产的意思),由原来的数组生产转换成另外一个数组 var arrayInt = ArrayBuffer(1,2,3,4,5,6); var intArrayVar2=for(e <- arrayInt if e>3) yield e*2 for(e<- intArrayVar2)print(e+","); |
8,10,12, |
5. 数组操作中的常用算法
var intArray = Array(1,2,3,4,5,6,7); // 求和,最大值,最小值 println(intArray.sum); println(intArray.max); println(intArray.min); println(intArray.toString()); println(intArray.mkString); println(intArray.mkString(",")); println(intArray.mkString("<",",",">")); |
28 7 1 [I@7d4991ad 1234567 1,2,3,4,5,6,7 <1,2,3,4,5,6,7> |
6. ArrayBuffer Scaladoc解析
7. 多维数组
var multiDimArr=Array(Array(1,2,3),Array(2,3,4)) for(arr<-multiDimArr;e<-arr)print(e+","); println() |
1,2,3,2,3,4, |
(二)列表List操作
1. List类型定义及List的特点
// 定义 var fruit = List("apple","banana","orange"); var fruit2 = List.apply("apple","banana","orange") var intList = List(1,2,3,4,5,6); // 多维列表 var diagMatrix = List(List(1,2,3),List(4,5,6)); // 遍历1 for(list <- diagMatrix){ for(ele<- list) print(ele+",") println(); } // 遍历2 for(list <- diagMatrix ; ele <- list)println(ele); |
1,2,3, 4,5,6, 1 2 3 4 5 6 |
1.不难看出,List与Array有着诸多的相似之处,但它们有两个明显的区别:
List一但创建,其值不能被改变,如前面的nums,改变其值的话,编译器会报错。
2.List具有递归结构(Recursive Structure),例如链表结构,List类型和其它类型集合一样,它具有协变性(Covariant),即对于类型S和T,如果S是T的子类型,则List[S]也是List[T]的子类型。
2. List常用构造方法
//采用::及Nil进行列表构建 val nums = 1 :: (2 :: (3 :: (4 :: Nil))) //由于::操作符的优先级是从右往左的,因此上一条语句等同于下面这条语句 val nums2 = 1::24::16::34::23::12::33::Nil |
|
3. List常用操作
package com.boom.scala.s2 object ListDemo { def main(args: Array[String]): Unit = { // 定义 var fruit = List("apple","banana","orange"); var fruit2 = List.apply("apple","banana","orange") var intList = List(1,2,3,4,5,6); //采用::及Nil进行列表构建 val nums = 1 :: (2 :: (3 :: (4 :: Nil))) //由于::操作符的优先级是从右往左的,因此上一条语句等同于下面这条语句 val nums2 = 1::24::16::34::23::12::33::Nil //插入排序算法实现 def isort(xs: List[Int]): List[Int] = if (xs.isEmpty) Nil else insert(xs.head, isort(xs.tail)) def insert(x: Int, xs: List[Int]): List[Int] = if (xs.isEmpty || x <= xs.head) x :: xs else xs.head :: insert(x, xs.tail) var new_nums2 = isort(nums2); for(e<-new_nums2)print(e+"\t"); // 集合连接操作 println() var megerList = fruit:::fruit2:::intList; for(e<-megerList)print(e.getClass()+":"+e+"\t"); //其它好用操作 println("nums:"+nums+",nums.init:"+nums.init); println("nums:"+nums+",nums.isEmpty:"+nums.isEmpty); println("nums:"+nums+",nums.head:"+nums.head); println("nums:"+nums+",nums.tail:"+nums.tail); println("nums:"+nums+",nums.tail.head:"+nums.tail.head); println("nums:"+nums+",nums.last:"+nums.last) println("nums:"+nums+",nums.reverse:"+nums.reverse) println("nums:"+nums+",nums.reverse.init:"+nums.reverse.init) println("nums:"+nums+",nums.tail.reverse:"+nums.tail.reverse) println("nums:"+nums+",nums drop 1:"+(nums drop 1)) println("nums:"+nums+",nums drop 3:"+(nums drop 3)) println("nums:"+nums+",nums take 1:"+(nums take 1)) println("nums:"+nums+",nums take 3:"+(nums take 3)) println("nums:"+nums+",nums.splitAt(2):"+nums.splitAt(2)) } } |
1 12 16 23 24 33 34 class java.lang.String:apple class java.lang.String:banana class java.lang.String:orange class java.lang.String:apple class java.lang.String:banana class java.lang.String:orange class java.lang.Integer:1 class java.lang.Integer:2 class java.lang.Integer:3 class java.lang.Integer:4 class java.lang.Integer:5 class java.lang.Integer:6 nums:List(1, 2, 3, 4),nums.init:List(1, 2, 3) nums:List(1, 2, 3, 4),nums.isEmpty:false nums:List(1, 2, 3, 4),nums.head:1 nums:List(1, 2, 3, 4),nums.tail:List(2, 3, 4) nums:List(1, 2, 3, 4),nums.tail.head:2 nums:List(1, 2, 3, 4),nums.last:4 nums:List(1, 2, 3, 4),nums.reverse:List(4, 3, 2, 1) nums:List(1, 2, 3, 4),nums.reverse.init:List(4, 3, 2) nums:List(1, 2, 3, 4),nums.tail.reverse:List(4, 3, 2) nums:List(1, 2, 3, 4),nums drop 1:List(2, 3, 4) nums:List(1, 2, 3, 4),nums drop 3:List(4) nums:List(1, 2, 3, 4),nums take 1:List(1) nums:List(1, 2, 3, 4),nums take 3:List(1, 2, 3) nums:List(1, 2, 3, 4),nums.splitAt(2):(List(1, 2),List(3, 4)) |
4. List伴生对象方法
//apply方法
scala> List.apply(1, 2, 3)
res139: List[Int] = List(1, 2, 3)
//range方法,构建某一值范围内的List
scala> List.range(2, 6)
res140: List[Int] = List(2, 3, 4, 5)
//步长为2
scala> List.range(2, 6,2)
res141: List[Int] = List(2, 4)
//步长为-1
scala> List.range(2, 6,-1)
res142: List[Int] = List()
scala> List.range(6,2 ,-1)
res143: List[Int] = List(6, 5, 4, 3)
//构建相同元素的List
scala> List.make(5, "hey")
res144: List[String] = List(hey, hey, hey, hey, hey)
//unzip方法
scala> List.unzip(res145)
res146: (List[Int], List[Char]) = (List(1, 2, 3, 4),List(1, 2, 3, 4))
//list.flatten,将列表平滑成第一个无素
scala> val xss =
| List(List('a', 'b'), List('c'), List('d', 'e'))
xss: List[List[Char]] = List(List(a, b), List(c), List(d, e))
scala> xss.flatten
res147: List[Char] = List(a, b, c, d, e)
//列表连接
scala> List.concat(List('a', 'b'), List('c'))
res148: List[Char] = List(a, b, c)
评论
发表评论
|
|