2-scala集合
1、集合的数据结构:
array、seq 、set 、map(映射)
2、集合分类
集合分为可变集合和不可变集合(除元组外,元组没有可变和不可变)
scala.collection.immutable : 不可变集合的包
scala.collection.mutable : 可变集合的包
3、集合初始化
不可变集合:
val s= Array[Int](10)
val s = Array[String]("Hello","World") val s = List[Int](1, 2, 3, 4)
val s = Set[Int](1,2,4) val s = Map("Ali" -> 10, "Bob" -> 3, "City" -> 8);
val s = Map(("Ali", 10), ("Bob", 3), ("City", 8));
可变集合:
val b = scala.collection.mutable.ArrayBuffer[Int]() val b = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4)
val b = scala.collection.mutable.Set(1,2,3) val b = scala.collection.mutable.Map[String,Int]()
val b = scala.collection.mutable.Map("Ali" -> 10, "Bob" -> 3, "City" -> 8) 注:系统默认是不可变集合,如果是可变,必须前面加包名
4、集合的公共操作
4.1、迭代(遍历)
一共三种方法:iterator、for、foreach
val coll= . . . //coll是一个集合、
val iter = coll.iterator
while (iter.hasNext) {
iter . next ()
} for (elem <- coll) { } //如果是map,则应该: for ((k,v) <- coll) { } List(1,2,3).iterator.foreach( println(_) ) //foreach 是Iterator上的方法
4.2、转化
val coll= . . . //集合都是可以互相转化的
coll.toSeq
coll.toSet
coll.toMap
coll.toArray //转化为不可变数组Array
coll.toBuffer //转化为可变数组ArrayBuffer
4.3、增删(++,- -)
val list = List(1, 2, 3, 4) //以list举例,其余的都可以
val list2 = list ++ list 注:不可变集合通过将结果赋值给另一个变量实现增,但是不能实现删 val listBuffer = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4) //以list举例,其余的都可以 listBuffer -= 4
listBuffer += 4
listBuffer ++= listBuffer //等价于listBuffer = listBuffer ++ listBuffer
listBuffer --= listBuffer //等价于listBuffer = listBuffer -- listBuffer
listBuffer = listBuffer ++ listBuffer
注:++、--是操作的集合,+、-是针对某一元素
5、Iterable 特质的重要方法(所有)
sum | product | max | min //和,乘积,最大值,最小值 head & last & headOption & lastOption //返回第(最后)一个元素,但是如果集合没有元素,head 会抛出异常,但是headOption会返回none eg : var coll = Map("A"->1, "B"->2, "C"->3)
coll.head //(A,1) tail & init //返回除第(最后)一个的元素集合 take(n) | drop(n) | splitAt() // take(n) | drop(n) <==>takeLeft(n) | dropLeft(n)。返回前n个元素,除前n个的其他元素,两组对偶 eg: var coll = Set(1, 2, 3, 4)
coll.take(2) //Set(1, 2)
coll.drop(2) //Set(3, 4)
coll.splitAt(2) //(Set(1, 2),Set(3, 4)) takeRight(n) | dropRight(n) //返回最后n个元素,除最后n个的其他元素,两组对偶 slice(from, to) //返回位于从from开始到to结束这个区间内的所以元素 eg:var coll = Set(1, 2, 3, 4)
coll.slice(0,2) //Set(1, 2) grouped //将集合分为两个 eg:val xs = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
xs.grouped(4).foreach(println) //List(1, 2, 3, 4),List(5, 6, 7, 8),List(9) mkString(before,between,after)、addString(sb, before, between, after) //转化为字符串 eg : var coll = List("a", "b", "c")
coll.mkString("<","-",">") //<a-b-c> map(f) | foreach(f) | flatMap(f) | collect(pf) //将函数f应用到所有元素 注:flatMap和map的区别: val arr = ["a b","c d"]
val arr2 = arr.flatMap (x => x.split(" ") ) //扁平化:["a","b","c","d"]
val arr3 = arr.map (x => x.split(" ") ) //[["a","b"],["c","d"]] count(pred) | forall(pred) | exists(pred) //返回满足时提前表达式的元素计数,所有元素满足时返回true,至少一个元素满足是返回true eg : var coll = Set(1, 2, 3, 4) coll.count(_<3) // filter(pred) | filterNot(pred) | partition(pred) //返回所有满足前提表达式的元素,所有不满足的元素,两组元素组成的对偶
takeWhile(pred) | dropWhile(pred) | span(pred) //和上面一样,只不过遇见第一个不满足,就不扫描了 eg :
var coll = Set(1, 3, 2) coll.filter(_<3) //Set(1)
coll.takeWhile(_<3) //Set(1, 2) coll.partition(_<2) //(Set(1,2),Set(3))
coll.span(_<2) //(Set(1),Set(3, 2)) reduceLeft 、reduceRight //reduceLeft <==> reduce。reduceLeft将结果作为左边参数,还有 (1 to 9) . reduceLeft( _ * _) //1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
arr.reduceLeft((a,b) => if (a > b) a else b //找出最大值 foldLeft : //foldLeft <== > fold。其实和reduceLeft差不多,只不过增加了初始值
List (1, 7, 2, 9). foldLeft (0) (_ * _) //0*1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 zip(coll2) | zipAll(coll2,fill,fill2) //返回由本集合元素和另外一个集合的元素组成的对偶,当长度不一致时,进行填充 var coll = List("a", "b")
var coll2 = List(1, 2)
coll.zip(coll2) //List(("a",1),("b",1)) 注: coll.filter(_<3) 等价于coll.filter(x => x <3)
coll.filter(_+_) //_只是匹配参数,第二个_表示第二个参数,但是没有第二个参数,所以这写法是错误的,一般推荐第二种
coll.filter(x => x + x) //把参数变为x,可以无限使用
6、Seq特质的重要方法(list、array)
reverse //倒置序列
contains(elem)、containsSlice(seq)、startsWith(seq)、endsWith(seq) //返回true,如果该序列:包含给定元素、包含给定序列、以给定序列开始、以给定序列结束 padTo(n,fill) //返回当前序列的一个拷贝,将fill的内容向后追加,直到新序列长度达到n
eg: val list2 = List(8,9)
val list = List(1,3,4,23,4,5)
list.padTo(5,list2) //List(1, 3, 4, 23, 4, 5) indexWhere(pred) //满足表达式的第一个元素索引
eg : val list = List(1,3,4,23,4,5,6,7,8,1,23)
list.indexWhere(_>20) // indexOf(elem)、lastIndexOf(elem)、indexOfSlice(seq)、lastIndexOfSlice(seq) //返回给定元素或序列在当前序列中的首次或末次出现的下标 intersect(seq)、diff(seq) //交集和序列之间的差异。 eg : val list2 = List(8,1,23,9)
val list = List(1,3,4,23,4,5)
list.intersect(list2) //List(1, 23)
list.diff(list2) //List(3, 4, 4, 5) sorted, sortWith(less), sortBy(f) //默认排序,二元函数排序、自定义函数排序 eg: "Mary had a" . split (" ").sortWith(_. length< _.length) //Array ("a ", "had","Mary")
7、线程安全的集合
SynchronizedBuffer
SynchronizedMap
SynchronizedPriorityQueue
SynchronizedQueue
SynchronizedSet
SynchronizedStack
注:方法还是大同小异,只不过是线程安全,但是速度慢,一般都是用线程不安全的集合
8、List、set
val set = Set(1,2,4)
val set = scala.collection.mutable.Set(1,2,3) //初始化
val list = List(1, 2, 3, 4)
val ListBuffer = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4) //List 增加了Nil(空表)、:: (等价于+:)、:::(等价于++:)的概念
//::操作单个元素,:::操作集合 val a= 9 : : List(4) //a = List(9,4)
val a = 9 : : 4 : : Nil //最右边必须是集合,不能val a= 9 : : 4 : : 2,所以加空表 val b = a ::: a 改写 :val b = a ++: a //但是不推荐改写 //因为底层是链表,还增加了首尾增加元素,了解
val a= 9 +: List(4, 2) //(9,4,2)
var b = List(4, 2) :+ 9 //(4,2,9)
9、数组
①不可变数组:Array
—————————————————————————————————————————————————————————
val s= Array[Int](10)
val s = Array[String]("Hello","World") s(0) = "GoodBye" //改,推荐使用
—————————————————————————————————————————————————————————
②可变数组:ArrayBuffer
—————————————————————————————————————————————————————————
val b = scala.collection.mutable.ArrayBuffer[Int]() b.insert(1, 6) //在下标为1的地方增加一个元素6
b.remove(2); //移除下标为2的元素
b.remove(2,2); //从下标为2的地方开始,移除两个元素 注:因为数组有顺序,多了指定位置增删,insert,remove
—————————————————————————————————————————————————————————
③常用方法:max、min、mkstring 、reverse
—————————————————————————————————————————————————————————
val arr = Array(1,2,3,4,5,6)
println(arr.max)
println(arr.min)
println(arr.mkString) //
println(arr.mkString("|")) //1|2|3|4|5|6
println(arr.mkString("[", "|", "]")) //[1|2|3|4|5|6]
println(arr.reverse) //Array(1,2,3,4,5,6)-->Array(6,5,4,3,2,1)
10、Map(映射)
①不可变映射:
——————————————————————————————————————————————————————————
val s = Map("Ali" -> 10, "Bob" -> 3, "City" -> 8); //初始化
val s = Map(("Ali", 10), ("Bob", 3), ("City", 8)); val aLi = s("Ali")
val aLi = s.getOrElse("Ali",0) //如果不存在返回0,推荐使用 for (i <- map.keySet) { //keyset、values方法
println(i);
} map.values
—————————————————————————————————————————————————————————
②可变映射
—————————————————————————————————————————————————————————
val s = scala.collection.mutable.Map[String,Int]() //初始化
val s = scala.collection.mutable.Map("Ali" -> 10, "Bob" -> 3, "City" -> 8) s("Ali") = 10 s += ("Dog" -> 12, "Esi" -> 10) //可变集合的增删举例
s - = "Ali"
—————————————————————————————————————————————————————————
③排序映射
—————————————————————————————————————————————————————————
val scores = scala .collection .mutable.SortedMap (”Alce " - > 10, ” Fred" - > 7, ” Bob” - > 3 , ”Cndy” -> 8)
//默认会按字典排序,就是说你遍历时候,会按字典排序出来(字典排序:unicode的字符集的前后位置) val months = scala . collection .mutable.LinkedHashMap (” January" > 1, ” February ” -> 2, “. . . )
//默认会按输入值的排序
11、Tuple(元组)
元组虽属于集合,但是以上的规律,增删都不适用。 val t1 = ("小明", "男", 23) println(t1._1 + ":" + t1._2 + "-" + t1._3) val arr1 = Array("a", "b", "c")
val arr2 = Array("A", "B", "C") val tuple = arr1 zip arr2 //拉链操作 ((a,A), (b,B), (c,C))
2-scala集合的更多相关文章
- Scala集合操作
大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka. ...
- Spark:scala集合转化为DS/DF
scala集合转化为DS/DF case class TestPerson(name: String, age: Long, salary: Double) val tom = TestPerson( ...
- Scala集合常用方法解析
Java 集合 : 数据的容器,可以在内部容纳数据 List : 有序,可重复的 Set : 无序,不可重复 Map : 无序,存储K-V键值对,key不可重复 scala 集合 : 可变集合( ...
- Scala集合笔记
Scala的集合框架类比Java提供了更多的一些方便的api,使得使用scala编程时代码变得非常精简,尤其是在Spark中,很多功能都是由scala的这些api构成的,所以,了解这些方法的使用,将更 ...
- Scala集合(一)
Scala集合的主要特质 Iterator,用来访问集合中所有元素 val coll = ... // 某种Iterable val iter = col.iterator while(iter.ha ...
- Scala集合类型详解
Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...
- 再谈Scala集合
集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下. 本文原文出处: 还是先上张图吧,这是我 ...
- Spark记录-Scala集合
Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...
- scala集合与java集合的转换应用
今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collec ...
- Scala集合学习总结
遍历集合可以使用迭代器iterator的那套迭代方式.Seq是一个有先后次序的序列,比如数组或列表.IndexedSeq可以通过下标进行任意元素的访问.例如ArrrayBuffer. Set是一组没有 ...
随机推荐
- pycharm开发django项目 static报404解决方法
settings文件中确保有以下配置 # Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.10/ ...
- struts中jsp表单控件命名注意
在jsp页面中写了这样的一个表单控件 <td>维修任务码</td><td><input type="text" id="mTas ...
- Jmeter性能监测及安装插件(推荐)
本文部分理论转自Jmeter官网:https://jmeter-plugins.org/wiki/PerfMon/ ,并结合个人实践编写 一.介绍 在负载测试期间,了解加载服务器的运行状况很重要.如 ...
- locate命令详解
Linux locate命令 locate(locate) 命令用来查找文件或目录. locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/ml ...
- RedHat如何关闭防火墙 : http://blog.csdn.net/chongxin1/article/details/76072758
版本号:RedHat6.5 JDK1.8 Hadoop2.7.3 hadoop 说明:从版本2开始加入了Yarn这个资源管理器,Yarn并不需要单独安装.只要在机器上安装了JDK就可以直接安 ...
- piwik高负载加速之切换session存储位置
默认情况下,piwik的session是存储于根目录下面的tmp/sessions/路径下面的.而官方文档里面说,如果由于本地硬盘的原因,这种设置可能会导致系统被变慢,这在高负载系统应用中可能是不可以 ...
- hyperledger fabric各类节点及其故障分析 摘自https://www.cnblogs.com/preminem/p/8729781.html
hyperledger fabric各类节点及其故障分析 1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端 ...
- 转 Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案
今早刚上班.客户打电话过来说系统访问不了,输入用户名.用户号不能加载出来!听到这个问题,第一时间想到的是不是服务器重新启动了,Oracle数据库的相关服务没有启动的原因.查看服务的时候,发现相关的服务 ...
- 关于高并发下kafka producer send异步发送耗时问题的分析
最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafka producer 进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程 ...
- Hiero_FnNukeShotExporter的解析与修改
研究对象:Hiero中的FnNukeShotExporter脚本 研究目的:修改FnNukeShotExporter使得可以将多个TrackItem导入到一个.nk中 FnNukeShotExpo ...