13、scala基础语法-集合常用方法

1、算数方法

   val list = List(1,4,3,5,3)

    println("sum="+list.sum) // 16
    println("sum="+list.max) // 5
    println("sum="+list.min) // 1
    println("sum="+list.product) // 180
    println(list.reverse) // List(3, 5, 3, 4, 1)

2、分组(返回值:例 Map[String, List[String]])

    //分组 Map[String, List[String]]  或  Map[Int, List[Int]]
    val res1: Map[Int, List[Int]] = list.groupBy(x=>x)
    println(res1) // Map(5 -> List(5), 4 -> List(4), 1 -> List(1), 3 -> List(3, 3))
    //res1.foreach(t=>print(t._1+"="+t._2+",")) // 5=List(5),4=List(4),1=List(1),3=List(3, 3),

    // 奇偶分类
    val res2: Map[Int, List[Int]] = list.groupBy(x=>{x % 2})
    res2.foreach(t=>print(t._1+"="+t._2+",")) //1=List(1, 3, 5, 3),0=List(4),

    //根据每一个元素的第二位进行分组
    val list1 = List("11","12","22","23","34")
    val res3: Map[String, List[String]] = list1.groupBy(x=>{x.substring(1)})
    println("****************")
    res3.foreach(t=>print(t._1+"="+t._2+",")) //2=List(12, 22),1=List(11),4=List(34),3=List(23),

3、排序

//排序(按照指定规则排序) sortBy 升序
    val res4: List[Int] = list.sortBy(x=>x)
    println(res4) // List(1, 3, 3, 4, 5)

    // sortWith 升序 小->大
    val res5: List[Int] = list.sortWith((x,y)=>{x<y})
    println(res5.mkString(",")) //1,3,3,4,5
    //降序 大->小
    val res6: List[Int] = list.sortWith((x,y)=>{x>y})
    println(res6.mkString(",")) //5,4,3,3,1

    val res7: List[String] = list1.sortWith((left, right) => {
      left.substring(1) < right.substring(1)
    })
    println(res7.mkString(",")) //11,12,22,23,34

4、迭代

    //迭代
    for (elem <- list.iterator) {
      println(elem)
    }

    val res9: List[(Int, Int)] = list.map(x=>{(x,1)})
    println(res9.mkString(",")) // (1,1),(4,1),(3,1),(5,1),(3,1)
    val res10: Map[Int, List[(Int, Int)]] = res9.groupBy(t=>t._1)
    res10.foreach(t=>print(t._1+"="+t._2+",")) //5=List((5,1)),4=List((4,1)),1=List((1,1)),3=List((3,1), (3,1)),
    //(k,List)  => (k,size)
    val res11: Map[Int, Int] = res10.map(t=>{(t._1,t._2.size)})
    println(res11.mkString(",")) // 5 -> 1,4 -> 1,1 -> 1,3 -> 2

6、扁平化操作

//扁平化操作(flatMap):将一个整体拆分成一个一个的个体
    val list2 = List("rose is beautiful","jennie is beautiful","lisa is beautiful","jisoo is beautiful")
    /**
      * 将list中的元素按照分隔符这里是空格拆分,然后展开
      * 先map(_.split(" "))将每一个元素按照空格拆分
      * 然后flatten展开
      * flatmap即为上面两个步骤的整合
      */
    val res12: List[Array[String]] = list2.map(x=>{x.split(" ")})
    val res13: List[String] = res12.flatten
    val res14: List[String] = list2.flatMap(_.split(" "))
    println(res13) //List(rose, is, beautiful, jennie, is, beautiful, lisa, is, beautiful, jisoo, is, beautiful)
    println(res14) //List(rose, is, beautiful, jennie, is, beautiful, lisa, is, beautiful, jisoo, is, beautiful)

    val list3: List[Int] = list.filter(x=>x%2 == 1)
    print(list3) // List(1, 3, 5, 3)
val list6 = List(("rose is beautiful",4),("tom is beautiful",5))
    val tuples: List[(String, Int)] = list6.flatMap(t => {
      val words: mutable.ArrayOps[String] = t._1.split(" ")
      words.map(x => (x, t._2))
    })
    print(tuples) //List((rose,4), (is,4), (beautiful,4), (tom,5), (is,5), (beautiful,5))

    val list7 = List(1,2,3,4)
    println(list7.reduce(_ + _)) // 10 (1+2+3+4)

7、拉链、交并补集

//拉链zip
    val list4 = List(2,3,4)
    val list5 = List(4,5,6,7)
    print(list4.zip(list5)) // List((2,4), (3,5), (4,6))

    //交集
    print("********")
    println(list4.intersect(list5))//List(4)
    //并集
    print(list4.union(list5))//List(2, 3, 4, 4, 5, 6, 7)
    //差集(从A中把B中也有的剔除)
    println(list4.diff(list5)) //List(2, 3)

8、reduce

   val list = List(1,4,3,5,3)

    println(list.reduce(_+_)) //16

    println(list.reduceLeft(_+_)) //16
    println(list.reduceRight(_+_)) //16

    println(list.reduceLeft(_-_)) //-14
    println(list.reduceRight(_-_)) // -2

源码:
1)reduce方法底层调用的是reduceLeft

reduce源码

2)reduceLeft源码

reduceLeft源码

var acc: B = 0.asInstanceOf[B] 创建一个起始值相同类型(B)的acc对象
例:println('a'.asInstanceOf[Int]) //97
println(12.asInstanceOf[Int]) //12

3)reduceRight源码

reduceRight源码

(x, y) => op(y, x) x,y位置互换
例:list.reduceRight(_-_) =》过程:
List(1,4,3,5,3) = 》List(3,5,3,4,1)=》5-3=》3-(5-3)=》4-(3-(5-3))=》1-(4-(3-(5-3))) 小括号内的结果,每次都放在后面一个位置了

9、fold

    val list = List(1,4,3,5,3)    
    println(list.fold(2)(_ + _)) // 18

    println(list.foldLeft(2)(_+_)) // 18
    println(list.foldRight(2)(_+_)) // 18

    println(list.foldLeft(2)(_-_)) // -14
    println(list.foldRight(2)(_-_)) // -4

1)fold底层调用foldLeft

fold源码

2)foldLeft源码

foldLeft源码

3)foldRight源码

foldRight源码

(x, y) => op(y, x) x,y位置互换
例:println(list.foldRight(2)(_-_)) =》过程:
List(1,4,3,5,3) = 》List(3,5,3,4,1)=》1-(4-(3-(5-(3-2)))) 小括号内的结果,每次都放在后面一个位置了

4)应用实例

import scala.collection.mutable

object Common_Method2 {
  def main(args: Array[String]): Unit = {
    val map1: mutable.Map[Char, Int] = mutable.Map('a'->2,'b'->5,'c'->4)
    val map2: mutable.Map[Char, Int] = mutable.Map('a'->3,'b'->4,'d'->3)

    val map3: mutable.Map[Char, Int] = map1.foldLeft(map2)((map, t) => {
      map(t._1) = map.getOrElse(t._1, 0) + t._2
      map
    })
    
    println(map3) // Map(b -> 9, d -> 3, a -> 5, c -> 4)
  }

}

map2相当于一个初始化值,用map1中的每一个去累加,foldLeft第二个小括号中的第一个参数是累加之后的结果集,传入map类型,和一个(char,Int)元素,返回一个map类型

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

推荐阅读更多精彩内容