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是一组没有 ...
随机推荐
- 说明os,sys模块不同?并列举常用的模块方法
官方解释: os: This module provides a portable way of usingoperating system dependent functionality. 翻译:提 ...
- mysql性能分析show profile/show profiles
MySQL性能分析show profiles show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情 ...
- Spring Cloud(Dalston.SR5)--Eureka 服务实例健康检查
默认情况下,Eureka 客户端每隔 30 秒会发送一次心跳给服务器端,告知正常存活,但是,实际环境中有可能出现这种情况,客户端表面上可以正常发送心跳,但实际上服务是不可用的,例如,一个需要访问数据的 ...
- mysql 删除数据库中所有的表中的数据,只删database下面所有的表。
select concat('drop table ',table_name,';') from TABLES where table_schema='数据库名称'; select concat('t ...
- django get post files请求知识点
GET: 我们在浏览器里直接键入地址回车,这种方式其实也是get方式提交了数据,如: http://localhost/login?user=123&pwd=123 就是把用户名123密码1 ...
- GPIO实验
一.目标:点亮led 1.看原理图:怎样点亮led 2.怎样GPF4输出0/1 a.配置功能 输出/输入/其他功能(中断或者其他) b.设置输出高电平/低电平 操作寄存器--->看芯片手册 A ...
- WebService的几种验证方式
转 http://www.cnblogs.com/yoshiki1895/archive/2009/06/03/1495440.html WebService的几种验证方式 1.1 WebS ...
- shaderFX一些小心得
同事需要一个能让贴图流动起来的shader,于是花了两天时间搞了一个,在这里要十分感谢同事的建议和提醒. 参考资料:<Digital Tutors - Implementing a Flow M ...
- Android adb 模拟滑动 按键 点击事件
模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text <string> input keyeven ...
- jenkins 邮件配置一
jenkins默认的邮件通知 我先讲解下,默认的. jenkins默认就有一个邮件通知,只是太简单的,不能个性化或者说定制化. 设置系统管理员邮件地址 邮件通知 ①SMTP服务器:如果你使用的是公司邮 ...