美文网首页
scala入门(2)

scala入门(2)

作者: G__yuan | 来源:发表于2018-01-26 17:23 被阅读0次

3.数组、映射、元组、集合

3.1数组

3.1.1定长数组和变长数组

object ArrayDemo {

def main(args: Array[String]):Unit = {

    //初始化一个长度为8的定长数组,其所有元素均为0

    //注意:如果new ,相当于调用了数组的apply方法,直接为数组赋值

      val arr1 =new Array[Int](8)

    //直接打印定长数组,内容为定长数组的hashcode值

      println(arr1)

    //将数组转成数组缓冲,就可以看到原数组中的内容了

    //toBuffer会将数组转换成数组缓冲

      println(arr1.toBuffer)//结果:ArrayBuffer(0, 0, 0, 0, 0, 0, 0, 0)

    //定义一个长度为3的定长数组

      var arr2 =Array("hadoop","spark","java")

    //使用()来访问数组

      println(arr2(2))

    //变长数组

    //如果想使用数组缓冲,需要导入import.scala.collection.mutable.ArrayBuffer包

      val ab = ArrayBuffer[Int]()

    //向数组缓冲的尾部追加一个元素

      ab +=1

      //追加多个元素

      ab +=(2,3,4,5)

    //追加一个数组(得++=)

      ab ++=Array(7,8)

    //追加一个数组缓冲

      ab ++=ArrayBuffer(19,20)

    //在数组的某个位置插入元素

      ab.insert(1,200,300)

    //删除某个位置的元素用remove

      ab.remove(2)

    println(ab.toString())

}

}

3.1.2遍历数组

1.增强for循环

2.好用的until会生成脚标,0 until 10 包含0 不包含10 (包前不包后)

object ForArrayDemo {

def main(args: Array[String]):Unit = {

    //初始化一个数组

      val arr =Array("haha","xixixi","lalal")

    //增强for

      for( a <- arr){

        println(a)

    }

    //好用的until会生成一个Range(范围)

    //reverse是将前面生成的Range反转

      for(a <- (0 until arr.length).reverse){

            println(a)

       }

}

}

3.1.3数组转换

yield关键字将原始数组进行转换会产生一个新的数组,原始数组不变

object ArrayYieldDemo {

def main(args: Array[String]):Unit = {

    //定义一个数组

      val arr =Array(1,3,4,5,6,7,8)

    //将偶数取出之后乘以10之后,生成一个新的数组

      val res =for (a <- arrif a %2 ==0)yield a *10

      println(res.toBuffer)

    //更高级的写法

    //filter 是过滤,接受一个返回值为Boolean的函数(相当于带for循环的if,里面的"_"是每次被循环对象中的值)

    //map 相当于将数组中的每一个元素取出来,应用传进去的函数

      val res2 = arr.filter(_ %2 ==0).map( _ *10)

        println( res2.toBuffer)

}

}

3.1.4数组中常用的算法

在Scala中,数组上的某些方法对数组进行相应的操作非常方便

3.2映射

在scala中,把哈希表这种数据结构叫做映射

3.2.1构建映射

第一种创建map的方式,用箭头

val map1 =Map("tom" ->85,"jerry" ->30)

第二种创建map的方式,用元组

val map2 =Map(("tom",85),("jerry",30))

3.2.2获取和修改映射中的值

直接通过key来获取,和java类似

val map2 =Map(("tom",85),("jerry",30))

println(map2("tom"))   // 结果:85

利用好用的getOrElse(如果映射中有key对应的值就返回,没有的返回默认值,下面的 0 则为默认值)

val map2 =Map(("tom",85),("jerry",30))

val value = map2.getOrElse("haha",0)

println(value) //结果:0

注意:在scala中有两种map,一个是immutable包下的map,该map的内容不可变;

另一个是mutable包下的map,该map中的内容是可变的

注意:通常我们在创建一个集合是会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着该变量的引用不可变,该引用中的内容是不是可变的,取决于这个引用指向的集合类型。

3.2.3创建元组

定义元组时用小括号将多个元素包起来,元素之间用逗号分隔,元素的类型可以不一样,元素个数可以任意多个

val t = ("jaja",19,Array(1,2),Map("tom" -> 34))

println(t._3)

3.2.4获取元组中的值

3.2.5将对偶的集合转换成映射

3.2.6拉链操作

zip命令可以将多个值绑定在一起

val names =Array("zhangsan","lisi","wangwu")

val sourse =Array(12,23,34,45)

val vl = sourse.zip(names)

val ns = names.zip(sourse)

println(vl.toBuffer) //结果:ArrayBuffer((12,zhangsan), (23,lisi), (34,wangwu))

println(ns.toBuffer) //结果:ArrayBuffer((zhangsan,12), (lisi,23), (wangwu,34))

注意:如果两个数组的元素个数不一致时,拉链操作后生成的数组数组的长度为较小的那个数组的元素个数

3.3集合

scala的集合有三大类:序列Seq(list)、集Set、映射Map,所有的集合都扩展自Iterable特质在scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)

3.3.1序列(list)

不可变的序列 import scala.collection.immutable._

在scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。

9 :: List(5,2)  “::” 操作符是将给定的头和尾创建一个新的列表

注意:::操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))

object ImmutListDemo {

def main(args: Array[String]):Unit = {

    //创建一个不可变的集合

      val lst1 =List(1,2,3)

    //将0插入到lst1的前面生成一个新的list(下面的方法都OK)

      val lst2 =0 :: lst1

      val lst3 = lst1.::(0)

      val lst4 =0 +:lst1

      val lst5 = lst1.+:(0)

       println(lst1,lst2,lst3,lst4,lst5)//结果:(List(1, 2, 3),List(0, 1, 2, 3),List(0, 1, 2, 3),List(0, 1, 2, 3),List(0, 1, 2, 3))

    //将一个元素添加到lst1的后面产生一个新的集合

      val lst6 = lst1 :+3

      println(lst6)//结果:List(1, 2, 3, 3)

      val lst7 = lst1 ++ lst2

      println(lst7)//结果:List(1, 2, 3, 0, 1, 2, 3)

    //将lst2插入到lst1 的里面生成一个新的list

      val lst8 = lst2 +: lst1

       println(lst8)//结果:List(List(0, 1, 2, 3), 1, 2, 3)

        //将lst2插入到lst1 的前面生成一个新的list

       val lst9 = lst2 ++: lst1

      println(lst9)//结果:List(0, 1, 2, 3, 1, 2, 3)

    //将lst0插入到lst1 的前面生成一个新的list

      val lst0 =List(4,5,6)

       val lst10 = lst1.:::(lst0)

        println(lst10)//结果:List(4, 5, 6, 1, 2, 3)

  }

}

可变的序列 import scala.collection.mutable._

import scala.collection.mutable.ListBuffer

object MutListDemo {

def main(args: Array[String]):Unit = {

    //构建一个可变列表,初始有3个元素1,2,3

      val lst0 = ListBuffer[Int](1,2,3)

    //创建一个空的可变的列表

      val lst1 = ListBuffer[Int]()

    //向lst1中追加元素,注意没有生成新的列表

      lst1 +=5

      lst1.append(6)

      println(lst1)//结果:ListBuffer(5, 6)

      //将lst0中的元素添加到lst1中,注意没有生成新的列表

      lst1 ++= lst0

     println(lst1)//结果:ListBuffer(5, 6, 1, 2, 3)

    //将lst0 和lst1合并成一个新的ListBbuffer,注意生成了新的列表

      val lst2 = lst0 ++ lst1

    println("lst0="+lst0+"lst1="+lst1+"ls2="+lst2)

    //结果:lst0=ListBuffer(1, 2, 3)lst1=ListBuffer(5, 6, 1, 2, 3)ls2=ListBuffer(1, 2, 3, 5, 6, 1, 2, 3)

    //将元素追加到lst0的后面生成一个新的集合

      val lst3 = lst0 :+5

      println(lst3)//结果:ListBuffer(1, 2, 3, 5)

  }

}

3.4 Set

不可变的Set

import scala.collection.immutable.HashSet

object ImmutSetDemo {

def main(args: Array[String]):Unit = {

    val set1 =new HashSet[Int]()

    //将元素和set1合成一个新的set,原set不变

      val set2 = set1 + (4,5)

    println(set2)//结果:Set(5, 4)

    //set中的元素不能重复

      val set3 = set2 ++Set(4,5,6)

    println(set3)//结果:Set(5, 6, 4)

      val set0 =Set(1,2,4) ++ set2

    println(set0)//结果:Set(1, 2, 4, 5)

      println(set0.getClass)//结果:class scala.collection.immutable.Set$Set4

  }

}

可变的Set

object MutSetDemo {

def main(args: Array[String]):Unit = {

    //创建一个可变的set

      val set1 =new mutable.HashSet[Int]()

    //向HashSet中添加元素

      set1 +=1

      set1.add(2)

    set1 ++=Set(3,4,5)

    println(set1)//Set(1, 5, 2, 3, 4)

    //删除一个元素

      set1 -=5

      set1.remove(2)

    println(set1)//Set(1, 3, 4)

  }

}

3.5 Map(可变的)

import scala.collection.mutable

object MutMapDemo {

def main(args: Array[String]):Unit = {

    val map1 =new mutable.HashMap[Int,String]()

    //向map中添加元素

    map1(1) ="hello"

    map1 += ((2 ->"xixi"))

    map1 += ((3,"lala"))

    map1.put(5,"scala")

    println(map1)//Map(2 -> xixi, 5 -> scala, 1 -> hello, 3 -> lala)

    //从map中移除元素

    map1 -=2

    map1.remove(1)

    println(map1)//Map(5 -> scala, 3 -> lala)

  }

}

相关文章

网友评论

      本文标题:scala入门(2)

      本文链接:https://www.haomeiwen.com/subject/seaiaxtx.html