一、主要的集合特质

Seq有先后顺序的序列,如数组列表。IndexedSeq通过下标快速的访问元素。不可变:Vector, Range, List 可变:ArrayBuffer, LinkedList

Set一组没有先后顺序的集合,SortedSet排过序的顺序被访问。

Map一组(键,值)对,SortedMap按照键的排序访问值。

+ 用于将元素添加到无次序的集合中,:+ 和 +: 用于将元素添加到有次序的集合中

++无序集合添加无序集合                     ++: 有序集合添加有序集合

                 ::: 列表添加列表

                 ::  列表添加元素

每个scala集合特质或类都有一个带apply方法的伴生对象,用来构建集合中的实例。

  Iterator(0xFF,0xFFFF,0xFF00).foreach(println(_))
SortedSet("world","hello").foreach(println(_))
Map(1 -> "First",2 -> "Second",3 -> "Third")

二、可变和不可变集合

  import scala.collection.immutable.Map  //不可变 map
import scala.collection.mutable.Map //可变 map

三、序列

不可变序列:Vector,Range

可变序列:ArrayBuffer

ArrayBuffer:

四、列表

 /*
* 四、列表
* 不可变列表 List
* 可变列表 LinkedList
*
* Nil空表
* digits.head, digits.tail
*
* 不可变列表 元素遍历 list.tail 使用递归调用
* 可变列表 元素遍历 list.elem 循环lsit.next
* ::添加元素 右结合 从末端开始构建,在表头进行插入
* :::批量添加元素,两个列表相加
* */ val digits = List(4,2)
println(digits.head)
println(digits.tail) val d1 = 3 :: digits //::右结合, 从末端开始构建,就是在表头进行插入
println(d1) val d2 = d1:+8
println(d2) //递归调用,遍历List
def sum(lst:List[Int]): Int ={
if (lst == Nil) 0 else lst.head + sum(lst.tail)
}
println(sum(d1)) //模式匹配,递归调用 遍历List
def sum1(lst:List[Int]):Int = lst match{
case Nil =>0
case h::t => h + sum1(t) // ::表示析构 将列表析构成表头和表尾
}
println(sum1(d1)) //可变列表,通过 .elem获取元素值并进行修改,通过.next进行后移
val lst = scala.collection.mutable.LinkedList(1,2,-1,-4,6)
var cur = lst
while(cur != Nil){
if(cur.elem < 0) cur.elem = 0
cur = cur.next
}

五、可变列表

如上

六、集

 /*
* 四、集
* Set 不重复元素的集合
* Set 集合分为可变的和不可变的集合。
* */ //集 添加元素 1 由于存在,结果不变
val s = Set(1,0,2)+1
println(s) //集合顺序
val set = Set(1,2,3,4,5)+6
for(i<- set){
print(i+" ") //查询结果顺序 5 1 6 2 3 4 顺序不是插入顺序,顺序是根据值的hashCode进行组织的
};println() //已经排序的集
val set1 = scala.collection.mutable.SortedSet(1,2,3,4,5)
for(i<-set1){
print(i+" ")
};println()

七、用于添加或去除元素的操作符

    /*
* 添加删除元素的操作符
* + 无序集合添加元素
* :+ 有序集合添加元素
* - 移除元素
* ++ --批量增加删除
* ::,::: 列表 优先使用
* */ //向量 不可变 返回新的集合
val v1 = Vector(1,2,3) :+ 5 // :+ 右加元素
println(v1)
var v2 = 0 +: v1 // +: 左加元素
var v3 = v1 ++ v2 // ++ 两个集合相加,返回新的集合
println(v2)
println(v3) //ArrayBuffer 可变
var num1 = ArrayBuffer(1,2,3,4) :+ 4 // :+ 右加元素 返回新的集合
var num2 = ArrayBuffer(11,22,33)
num1 += 2 // += 增加元素,修改集合
num1 -= 2 // -= 删除元素,从头开始
num1 ++= num2 // ++= 两个集合相加
println(num1)
println(num2) //Set |并集 &交集 &~差集
val s1 = scala.collection.immutable.Set(1,0,2,3)
val s2 = scala.collection.mutable.Set(2,3,4,5)
val s3 = s1 + 1 // 无序使用 +
val s4 = s1 | s2 // 并集 等同于++
val s5 = s1 & s2 // 交集
val s6 = s1 &~ s2 // 差集 属于s1不属于s2 等同于--
var s7= s2 &~ s1 // 差集 属于s2不属于s1 等同于--
s2 -= 4 //-= 删除元素内容
//s1 -= 1 //报错, 不可变集合
println(s2)
println(s3)
println(s4)
println(s5)
println(s6)
println(s7)

八、常用方法

九、将函数映射到集合

    /*
* 将函数映射到集合
* map, flatMap, foreach...
*
* */ //map
val name = List("Jim","Rob","Tom")
println(name.map(_.toUpperCase)) //flatMap
def as(s:String) = List(s.toUpperCase,s.toLowerCase())
println(name.flatMap(as)) //foreach
name.foreach(println) //collect
val col= "+4-3".collect{case '+'=> 1;case '-'=> -1; case _ => 0}
println(col)
List(JIM, ROB, TOM)
List(JIM, jim, ROB, rob, TOM, tom)
Jim
Rob
Tom
Vector(1, 0, -1, 0)

十、化简、折叠和扫描

    /*
* 十、化简、折叠和扫描
* reduce
* fold
* scan
* */ //reduceLeft 从左侧两元素互操作 1-7-2-9 -17
val li = List(1,7,2,9)
var re =li.reduceLeft(_ - _)
println(re)
//reduceRight 从右侧两元素互操作 (1-(7-(2-9))) -13
re = li.reduceRight(_-_)
println(re) //foldLeft 初始值为0,从左侧开始 0-1-7-2-9 -19
val f = List(1,7,2,9)
var re1 = f.foldLeft(0)(_-_)
println(re1)
//foldRight 初始值为0,从右侧开始 (1-(7-(2-(9-0)))) -13
re1 = f.foldRight(0)(_-_)
println(re1) // /: 表示 foldLeft :\ 表示 foldRight 树: 树的左侧/: 树的右侧:\
val f1 = (0 /: List(1,7,2,9))(_-_)
val f2 = (List(1,7,2,9) :\ 0)(_-_)
println(f1)
println(f2) //计算字符串中字母出现的频率
//方法1:通过可变map循环字符串,累加计数进行计算
val freq = scala.collection.mutable.Map[Char,Int]()
for(c<- "Mississippi"){
freq(c) = freq.getOrElse(c,0) + 1
};println(freq) //方法2:通过foldLeft对数据进行计算,
val m1 = (Map[Char,Int]() /: "Mississippi"){
(m, c) => m + (c -> (m.getOrElse(c,0)+1)) //m代表map, c代表字符 每次一个字符进来持续计算,然后结果加入到map中,然后返回map
};println(m1) //scanLeft scanRight 得到计算中间结果
val ran = (1 to 10).scanLeft(0)(_+_)
println(ran) //Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55)
-17
-13
-19
-13
-19
-13
Map(M -> 1, s -> 4, p -> 2, i -> 4)
Map(M -> 1, i -> 4, s -> 4, p -> 2)
Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55)

十一、拉链操作

    /*
* 十一、拉链
* zip
* zipAll
* zipWithIndex
* */ //zip
val prices = List(5.0, 20.0, 9.95)
val quantities = List(10, 2) println(prices.zip(quantities))
println(prices.zip(quantities).map{p=>(p._1 * p._2)})
//zipWithIndex
println("Scala".zipWithIndex) //zipAll
println(prices.zipAll(quantities,0,1)) //全部zip,缺少元素使用默认值;that 少用0,this 少用1 println("Scala".zipWithIndex.max)
println("Scala".zipWithIndex.max._2)
List((5.0,10), (20.0,2))
List(50.0, 40.0)
Vector((S,0), (c,1), (a,2), (l,3), (a,4))
List((5.0,10), (20.0,2), (9.95,1))
(l,3)
3

十二、迭代器

十三、流

十四、懒视图

十五、与Java集合的互操作

十六、线程安全的集合

十七、并行集合

参考《快学Scala》

Scala--集合的更多相关文章

  1. Scala集合操作

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

  2. Spark:scala集合转化为DS/DF

    scala集合转化为DS/DF case class TestPerson(name: String, age: Long, salary: Double) val tom = TestPerson( ...

  3. Scala集合常用方法解析

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

  4. Scala集合笔记

    Scala的集合框架类比Java提供了更多的一些方便的api,使得使用scala编程时代码变得非常精简,尤其是在Spark中,很多功能都是由scala的这些api构成的,所以,了解这些方法的使用,将更 ...

  5. Scala集合(一)

    Scala集合的主要特质 Iterator,用来访问集合中所有元素 val coll = ... // 某种Iterable val iter = col.iterator while(iter.ha ...

  6. Scala集合类型详解

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

  7. 再谈Scala集合

    集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下. 本文原文出处:  还是先上张图吧,这是我 ...

  8. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

  9. scala集合与java集合的转换应用

    今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collec ...

  10. Scala集合学习总结

    遍历集合可以使用迭代器iterator的那套迭代方式.Seq是一个有先后次序的序列,比如数组或列表.IndexedSeq可以通过下标进行任意元素的访问.例如ArrrayBuffer. Set是一组没有 ...

随机推荐

  1. 【读书笔记】iOS-网络-HTTP-请求内容

    一,GET方法. 从服务器获取一段内容,用HTTP术语来说就是实体.GET请求通常不包含请求体,不过也是可以包含的.有些网络缓存设施只会缓存GET响应.GET请求通常不会导致服务器端的数据变化. 二, ...

  2. FineReport新增多项目甘特图示例及操作

    1.描述 我们在做报表的时候,往往想体现其中随着时间的变化而产生的项目进度的变化和其他相关的系统进展,每当这种时候甘特图便是其中的不二之选.FineReport新增的多项目甘特图可以说是满足了大多数的 ...

  3. SQLServer 常见SQL函数

    SQL Server SQL函数 by:授客 QQ:1033553122 字符函数 日期函数 数学函数 系统函数

  4. 《ECMAScript6标准入门》第三版--读书笔记

    2015年6月,ECMAScript 6正式通过,成为国际标准.尽管在目前的工作中还没有使用ES6,但是每项新技术出来总是忍不住想尝尝鲜,想知道ES6能为前端开发带来哪些变化?对自己的工作有哪些方面可 ...

  5. Prometheus Node_exporter 之 Network Netstat UDP

    Network Netstat UDP /proc/net/snmp 1. UDP In / Out type: GraphUnit: shortLabel: Datagrams out (-) / ...

  6. Oracle EBS AP 创建贷项通知单并核销到相应发票

    --1.0 生成与发票一样的贷项通知单 created by jenrry 20170423 DECLARE L_CUSTOMER_TRX_ID NUMBER; L_INVOICE_NUMBER VA ...

  7. NGUI和UGUI图片字 艺术字(Bitmap图片转文字)制作方法

    用图片字而不是图片 美术和程序的配合,需要程序能够很快抓住问题重点并提出解决方案.美术出的图片字比我们使用的字体更好好看,那么是否要一个个图片去拼成数字呢? NGUI创建图片字 准备材料 美术提供的数 ...

  8. Java-Swing常用布局管理器

    http://www.cnblogs.com/hthuang/p/3460234.html   5.Java-Swing常用布局管理器       应用布局管理器都属于相对布局,各组件位置可随界面大小 ...

  9. 【Alpha 冲刺】 4/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成 会遗漏一些部分的api,但是通过群里询问以及对页面的review解决 孙浩楷 根据UI设计, 实现左侧 ...

  10. 第二次项目冲刺(Beta版本)2017/12/10

    一.任务分布 二.燃尽图 三.站立式会议 1.照片(再给我两分钟) 2.任务安排 四.总结 冲刺的最后一天了,时间安排的不够好,还有部分功能没有完成,大家都尽力了,我们后续会抓紧时间完成项目.