Java 集合 : 数据的容器,可以在内部容纳数据
   List : 有序,可重复的
   Set : 无序,不可重复
   Map : 无序,存储K-V键值对,key不可重复

scala 集合 : 可变集合(ArrayList) & 不可变集合(数组)
   String(不可变字符串), (StringBuilder, StringBuffer)(可变字符串)

集合的基本方法

    val list: List[Int] = List(1,2,3,4)
// 反转集合
//println(list.reverse) //List(6, 5, 4, 3, 2, 1) //set,map没有反转
list.max
list.min
list.sum //求和
list.product //乘积 // TODO 排序
//val listStr = List("1", "5", "9", "11")
//println("排序 = " + listStr.sorted) //排序 = List(1, 11, 5, 9) 按照字典顺序; 数字、字符串都是按字符串的字典顺序排序 val stringList = List("11", "55", "13", "22")
// 1, 5, 3, 2
// 11 22 13 55
// TODO 排序 使用自定义排序规则进行排序
println(stringList.sortBy(x => {
x.substring(1, 2) //List(11, 22, 13, 55)
}))
//TODO 排序:升序,降序
println("升序= " + stringList.sortWith{ //升序= List(11, 13, 22, 55)
case (left, right) => {
left < right
}
})
println("降序= " + stringList.sortWith{ //降序= List(55, 22, 13, 11)
case (left, right) => {
left > right
}
})
TODO : 分组  groupBy(x=>{x%2})
    println("分组= " +list.groupBy(x => {   //分组= Map(1 -> List(1, 3, 5), 0 -> List(2, 4, 6))
x % 2
}))
聚合
Map 转换,映射
// map方法将集合中的每一个元素进行转换后放置到新的集合中
    println(list.map(_ * 2)) //List(2, 4, 6, 8, 10, 12)
println(list.map((_, 1))) //List((1,1), (2,1), (3,1), (4,1), (5,1), (6,1))

flatMap 扁平化  数->可迭代

(整体,拆成一个个的个体变成可迭代的集合

    val list: List[Int] = List(1,2,3,4)

  // TODO flatMap 扁平化
val list2 = List(List(1,2), List(3, 4), List(5, 6)) // ==> List(1,2,3,4,5,6)
// in : List, out : Iterator
println("扁平化=" + list2.flatMap(x => x)) //扁平化=List(1, 2, 3, 4, 5, 6) 集合中整体拆成一个个的 
 reduce 化简,也称归约
    // TODO reduce 化简
println(list.reduce((_ + _))) //10 两两聚合
println(list.reduce(_ - _)) //-8
println(list.reduceLeft(_ - _))//-8 同上,底层调用是一样的
println(list.reduceRight(_ - _)) //-2 从右边开始计算

fold 折叠foldLeft    foldRight 缩写分别为 /: 和 :\

scala中两个map的合并 foldLeft

    val list: List[Int] = List(1,2,3,4)

// TODO fold fold和reduce比较类似,仅仅是多了一个集合之后的初始值
println(list.fold(10)(_ - _)) // -0 底层本质上就是调用的foldLeft(z)(op)
println(list.foldLeft(10)(_ - _)) //-0 // 1,2,3,4 ==> reverse ==> 4,3,2,1
// 底层运算时,将集合反转后相邻的元素交互调用逻辑
println(list.foldRight(0)(_ - _)) //-2
//reverse.foldLeft(z)((right, left) => op(left, right))

扫描 scanLeft

扫描,即对某个集合的所有元素做fold操作,但是会把产生的所有中间结果放置于一个集合中保存

    def minus(num1: Int, num2: Int): Int = {
num1 - num2
}
val i1 = (1 to 5).scanLeft(5)(minus) //1 2 3 4 5
//5 4 2 -1 -5 -10
println(i1) //Vector(5, 4, 2, -1, -5, -10) def add( num1 : Int, num2 : Int ) : Int = {
num1 + num2
}
val i2 = (1 to 5).scanLeft(5)(add) //1 2 3 4 5
//5 6 8 11 15 20
println(i2) //Vector(5, 6, 8, 11, 15, 20)

集合交Intersect、差diff、合union

    val lis1 = List(1,2,3,4)
val lis2 = List(3,4,5,6,7)
// 两个集合合并
println(lis1.union(lis2)) //List(1, 2, 3, 4, 3, 4, 5, 6, 7)
// 两个集合交集
println(lis1.intersect(lis2)) //List(3, 4)
// 两个集合差集
println(lis2.diff(lis1)) //List(5, 6, 7)
拉链,将两个集合进行 对偶元组合并,可以使用拉链
 List1(1,2,3,4) List2(3,4,5,6,7) #多余的它会舍掉
println(lis1.zip(lis2)) //List((1,3), (2,4), (3,5), (4,6))

滑动窗口 sliding

   // 滑动窗口window
val intses: Iterator[List[Int]] = list.sliding(3)
for (elem <- intses) {
println(elem) //List(1, 2, 3)
//List(2, 3, 4)
}

过滤filter   a.filter(_%2 == 0)

    // TODO 过滤
val a = List(1, 2, 3, 4)
def test(i: Int): Boolean = {
i % 2 == 0
}
println("过滤=" + a.filter(test)) //简化如下
println(a.filter(_ % 2 == 1))

wordcount

object TestWorldCount {
def main(args: Array[String]): Unit = {
// 数据
val lines = List("Hello Atguigu", "Hello Scala", "Hello Hbase", "Hi Atguigu")
// 将一行的数据进行分解,变成一个一个的单词(扁平化)
val words: List[String] = lines.flatMap(line => {line.split(" ")})
// 将扁平化后的单词进行分组
val groupNameToWordMap: Map[String, List[String]] = words.groupBy(word=>word)
// 将分组后的数据转换为单词和数量的结构 _1是单词分组名称; t._2是集合
val wordToCountMap: Map[String, Int] = groupNameToWordMap.map(t=>{(t._1, t._2.size)})
// 将转换后的数据进行排序
// map(k-v, k1-v1, k2-v2) ==> List((k,v), (k1,v1))
val resultList: List[(String, Int)] = wordToCountMap.toList.sortWith {
case (left, right) => {
left._2 > right._2 //元组, 根据v去比较判断
}
}
---------------简化版-------------------------------
val resultList: List[(String, Int)] = lines.flatMap(_.split(" ")).groupBy(word => word).map(t => {
(t._1, t._2.size)
}).toList.sortWith {
case (left, right) => {
left._2 > right._2
}
}
-----------------------------------------
resultList resultList.foreach(println)
} }

map中_1 key, _2 value

array考虑泛型,map的k,v不考虑泛型

Scala集合常用方法解析的更多相关文章

  1. Scala实战高手****第6课 :零基础实战Scala集合操作及Spark源码解析

    本课内容1.Spark中Scala集合操作鉴赏2.Scala集合操作实战 --------------------------------------------------------------- ...

  2. Scala集合类型详解

    Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...

  3. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  4. Scala词法文法解析器 (二)分析C++类的声明

    最近一直在学习Scala语言,偶然发现其Parser模块功能强大,乃为BNF而设计.啥是BNF,读大学的时候在课本上见过,那时候只觉得这个东西太深奥.没想到所有的计算机语言都是基于BNF而定义的一套规 ...

  5. Scala词法文法解析器 (一)解析SparkSQL的BNF文法

    平台公式及翻译后的SparkSQL 平台公式的样子如下所示: if (XX1_m001[D003]="邢おb7肮α䵵薇" || XX1_m001[H003]<"2& ...

  6. JavaScript数组常用方法解析和深层次js数组扁平化

    前言 数组作为在开发中常用的集合,除了for循环遍历以外,还有很多内置对象的方法,包括map,以及数组筛选元素filter等. 注:文章结尾处附深层次数组扁平化方法操作. 作为引用数据类型的一种,在处 ...

  7. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  8. Scala集合操作

    大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka.  ...

  9. Device Tree常用方法解析

    Device Tree常用方法解析 Device Tree在Linux内核驱动中的使用源于2011年3月17日Linus Torvalds在ARM Linux邮件列表中的一封邮件,他宣称“this w ...

随机推荐

  1. 【LR9】【LOJ561】CommonAnts 的调和数 数论 筛法

    题目大意 有一个长度为 \(n\) 的序列. 有 \(m\) 次修改,每次给你 \(x,y\),令 \(\forall 1\leq i\leq \lfloor\frac{n}{x}\rfloor,a_ ...

  2. 「洛谷1884」「USACO12FEB」过度种植【离散化扫描线】

    题目链接 [洛谷传送门] 题解 矩阵面积的并模板.(请求洛谷加为模板题) 很明显是要离散化的. 我们将矩阵与\(x\)轴平行的两个线段取出来.并且将这两个端点的\(x1\)和\(x2\)进行离散化. ...

  3. CSS伪类整理笔记

    0 伪元素 虚拟的一个元素,用于向已有的元素添加特殊效果,可用标签元素实现该效果. css3中规定:伪元素的由两个冒号::开头,然后是伪元素的名称.用两个冒号::是为了区别伪类和伪元素(CSS2中并没 ...

  4. (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

    背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...

  5. Spotlight--你不得不用的Mac查询利器

    世界上有两种Mac用户:一种是经常使用Spotlight的,另一种是忽略Spotlight的.如果你是第二种用户,那么你需要改变.Mac所有方面的使用场景,都会随着Spotlight而变得更快.你只需 ...

  6. idea设置JVM运行参数

    对JVM运行参数进行修改是JVM性能调优的重要手段,下面介绍在应用程序开发过程中JVM参数设置的几种方式. 方式一 java程序运行时指定 -Dproperty=value 该参数通常用于设置系统级全 ...

  7. 常用的消息队列中间件mq对比

    原文地址:https://blog.csdn.net/qq_30764991/article/details/80239076 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...

  8. python学习03

    字符串的基本使用 1.字符编码集 ASCII编码:外国人常用的大小写英文字母.数字和一些符号,一共127个字符,用1个字节(byte)可以涵盖完,也就是8个位,它将序列中的每个字节理解为一个字符. U ...

  9. java(9)类和对象

    一.理解什么是类和对象 万事万物皆对象 1.1.属性——对象具有的特征(特点) 1.2.方法——对象可执行的操作(能干什么事) 1.3.对象的定义: 是一个客观存在的,看的见或摸得着的实体,由属性和方 ...

  10. 分布式系列四: HTTP及HTTPS协议

    分布式系列四: HTTP及HTTPS协议 非常全面的一篇HTTP的文章: 关于HTTP协议,一篇就够了 还有一个帮助理解HTTPS的文章: 也许,这样理解HTTPS更容易 本文的一些描述摘自这篇文章 ...