scala入门(2)

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)

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容