scala系列(二)数组与列表操作

  |   0 评论   |   1,107 浏览

二、数组与列表操作

(一)数组操作

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(03);

      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>3yield 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)

评论

发表评论

validate