Scala-Unit4-Scala数组/集合
一、Scala数组
1.数组的定义:
方法一:val arr = new Array[String](3)
String代表数据的元素类型、3表示数组的长度
方法二:val arr = Array[Int](1,3,5,7)
修改数组某元素:arr(1) = 18
注意:数组的长度不可改变,arr += 9(错误,数组不可添加元素),在定义数组时数据类型可以省略
2.数组的方法
1)map(映射)
object MapTest {
def main(args: Array[String]): Unit = {
val arr = Array[Int](1,3,5,7)
val arr1 = arr.map(x => x*5)
println(arr1.toBuffer)
}
}
注意:在Scala语言中,使用toBuffer来将堆地址转换为其对应数据信息。
2)flatten(扁平化)
命令行操作:val arr = Array("hello hunter henchou","hello reba henmei")
arr.map(_.split(" ")) //res1: Array[Array[String]] = Array(Array(hello, hunter, henchou), Array(hello, reba, henmei))
arr.map(_.split(" ")).flatten //res2: Array[String] = Array(hello, hunter, henchou, hello, reba, henmei)
3)flatMap(先做map映射,再做flatten扁平化)
命令行操作:arr.flatMap(_.split(" ")) //res3: Array[String] = Array(hello, hunter, henchou, hello, reba, henmei)
4)foreach(遍历数组)
命令行操作:val arr = Array(2,4,6,8)
arr.foreach(x => print(x)) //2468
5)groupBy(分组)
命令行操作:val arr = Array("hello hunter henchou","hello reba henmei")
需求1:将arr分解成一个包含arr所有单词的数组,然后根据单词进行分类
arr.flatMap(_.split(" ")).groupBy(x => x)
//结果:res9: scala.collection.immutable.Map[String,Array[String]] = Map(reba -> Array(reba), henmei -> Array(henmei), hunter -> Array(hunter), henchou -> Array(henchou), hello -> Array(hello, hello))
需求2:将arr进行单词计数wordcount
arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length))
//结果:res12: scala.collection.immutable.Map[String,Int] = Map(reba -> 1, henmei -> 1, hunter -> 1, henchou -> 1, hello -> 2)
6)sortBy(排序)
命令行操作:val arr = Array("hello hunter henchou","hello reba henmei")
需求:将arr进行单词计数并按照降序排序:
arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)).toList.sortBy(x => x._2)
//结果:res16: List[(String, Int)] = List((reba,1), (henmei,1), (hunter,1), (henchou,1), (hello,2))
注意:arr数组进行完groupBy后时Map集合,而Map集合不支持sortBy方法,必须将其用toLis或toArrayt转为List集合或Array数组再进行排序。
二、集合
1.集合的分类:1)可变集合(mutable)
2)不可变集合(Immutable)
2.集合的定义:
1)定义不可变集合:val s = List(1,3,5)
不可变集合元素不可修改,长度也不能改变(即不能添加元素)

可以通过命令"scala.collection.immutable."查看所有不可变集合

2)定义可变集合:定义可变集合前必须导入可变集合的包
import scala.collection.mutable._
val s = ArrayBuffer(2,4,6)
可变集合可以修改集合元素,也可以添加元素

可以通过命令”scala.collection.mutable.“查看所有可变集合

3.集合的部分方法
方法名 方法作用
head 取头元素
tail 取尾元素(除了头全是尾元素)
:: 在部分集合头部加入元素(如List,Nil,可以同时添加多个元素)
+ 字符串的拼接
.+: 在集合头部追加元素
.:+ 在集合尾部追加元素
++/++:/::: 两个集合相加合并
count 统计个数
filter 过滤
sortBy 排序(按照集合中某一个元素进行升序或降序排序)
sortWith 排序(按照条件给定的对应两个元素进行排序)
grouped 分组(按照条件数字将集合分组,如条件为2,则两两分组)
fold 折叠
foldLeft 左折叠(同fold)
foldRight 右折叠(初始值在右,按照从右到左的顺序进行计算)
reduce 聚合
aggregate 先局部聚合再全局聚合(分布式优化的方式,它底层调用的是flodLeft)
zip 拉链
sum 一个集合求和
**举例如下:
val l1 = List(4,3,5,1,9)
val l2 = List(("h",2),("r"4),("m",8))
val l3 = List(1,2,3,4,5)
var l4 = List(3)
1)取出集合l1中的头元素和尾元素
l1.head //4 l1.tail //3,5,1,9
2)算出集合l1与l3中大于4的元素个数
l1.count(x => x>4) //2
l3.count(x => x>4) //1
3)将集合l1中大于等于5的元素取出成为一个新的集合
l1.filter(x => x>=5) //(5,9)
4)新定义集合l5等于集合l4头部添加元素1,在尾部添加元素4
var l5 = l4.+:1 l5 = l4.:+4
5)将集合l2按照每个元素中的数字进行倒叙排序
l2.sortBy(x => - x._2) l2.sortWith((x,y) => x._2 > y._2)
6)将新的集合l5分别进行左折叠和右折叠相减,初始值都为2
l5.fold(2)(_ - _) //-6
l5.foldRight(2)(_ - _) //0
7)将集合l3与集合l1进行拉链
l3.zip(l1)
8)将集合l1、l3、l4进行相加形成新集合
l1:::l3:::l4
4.部分特殊集合
1)Nil:空列表
在空列表前加入多个元素: 1::2::3::Nil
2)Set集:无序的、不可重复的、不可变的集合
val s = Set(2,3,3,4) //=>得到的集合为s = (2,3,4)
s += 5 //先集合s添加元素5,语法错误
3)HashSet:可变的集合
val hs = collection.mutable.HashSet(2,3,4)
hs += 5
hs.remove(2) //删除的是元素2,而不是索引为2的元素
4)Map集:不可变
val m = Map[String,Int]("hello" -> 2,"reba" -> 8)
m("hello") //查看key为hello对应的value值
5)HashMap:可变
val hm = collection.mutable.HashMap[String,Int]()
hm.put("hunter",32) hm += "weight" -> 140 //添加元素kv对
hm.get("hunter") hm("hunter") //查看hunter对应的值
hm.remove("hunter") hm -= "hunter" //删除hunter对应的值
hm.getOrElse("hunter",28) //28 如果有值返回值,没有返回默认值,hunter对应的值被删除了
5.元祖tuple:元祖中可以是任意元素
val t = (2,"hunter",true,Unit)
t._1 //2,取出元祖中第一个元素
对偶元祖:有两个元素的元祖
val t1 = ("hunter",18)
t1.swap //(18,"hunter"),将两个元素换位
val t2 = Array(("reba",18),("hunter",32)) 用右折叠计算hunter比reba大几岁?
t2.swap
t2.foldRight(0)(_._2 - _)
Scala-Unit4-Scala数组/集合的更多相关文章
- Scala数组| 集合
arrays :+ 5尾部 头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Ar ...
- Scala基础:数组(Array)、映射(Map)、元组(Tuple)、集合(List)
数组 package com.zy.scala object ArrayDemo { def main(args: Array[String]): Unit = { //定长数组 val arr1 = ...
- [原创]Scala学习:数组的基本操作,数组进阶操作,多维数组
1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...
- 2. scala中的数组
一. 数组声明 定长数组 scala> new Array[String](5) res1: Array[String] = Array(null, null, null, null, null ...
- Scala学习(三)----数组相关操作
数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不 ...
- Scala详解---------数组、元组、映射
一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需new关键字 Scala声明数组时,需要带有Arr ...
- Scala具体解释---------数组、元组、映射
一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初始值的数组,无需newkeyword Scala声明数组时.须要带 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- 【Scala】Scala之String
一.前言 大数据领域的Spark.Kafka.Summingbird等都是由Scala语言编写而成,相比Java而言,Scala更精炼.由于笔者从事大数据相关的工作,所以有必要好好学习Scala语言, ...
- 【Scala】Scala技术栈
快速了解Scala技术栈 我无可救药地成为了Scala的超级粉丝.在我使用Scala开发项目以及编写框架后,它就仿佛凝聚成为一个巨大的黑洞,吸引力使我不得不飞向它,以至于开始背离Java.固然Java ...
随机推荐
- LuoGu P1083 借教室
题目传送门 借教室这个题有两种做法,差分+前缀和或者是线段树 线段树维护区间最小值,因为能不能借教室使用是由这几天中可用教室最少的一天决定的 其实这题是个很裸的线段树维护区间最小值,但有一点需要注意, ...
- ssh 登录报错 packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
问题 更新个人博客文章时遇到:Error: packet_write_wait: Connection to 192.30.253.113 port 22: Broken pipe packet_wr ...
- VBS将本地的Excel数据导入到SQL Server中
VBS将本地的Excel数据导入到SQL Server中 高文龙关注0人评论1170人阅读2017-05-14 12:54:44 VBS将本地的Excel数据导入到SQL Server中 最近有个测试 ...
- oracle数据库内存调整之增加内存
注:本文来源:小颜Kevin <oracle数据库内存调整之增加内存> 模拟操作系统内存从2G增加为8G后,调整数据库内存参数,示例中参数不作为实际生产环境参考,因为因需所取,调整参数 ...
- RHCE认证考前辅导
一一:Linux认证题库详细说明 注意事项 (1) RHCSA上午2.5小时,RHCE下午3.5小时,考生需对题目非常熟练. (2) 5样东西必带(身份证.1支黑色水笔.常用邮箱.姓名拼音.聪明的脑袋 ...
- Swift 设置某个对象的normal 属性找不到normal 解决方案
normal 等价于 UIControlState(rawValue: 0)
- 基于kali linux无线网络渗透测试
1.无线网络渗透测试目前主要有三种方式,分别是暴力破解PIN码,跑握手包,搭建伪热点三种方式,当然还存在其他的方式. 1.1暴力破解 路由器的PIN码由八位0-9的数字组成,PIN码由散步风组成,前四 ...
- 【转】asp.net Core 系列【一】——创建Web应用
ASP.NET Core 中的 Razor 页面介绍 Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效. 若要查找使用模型视图控制器方法的教程, ...
- 51 NOd 2006 飞行员配对(匈牙利算法二分匹配)
题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一 ...
- javascript 中 x offsetX clientX screenX pageX的区别
在javascript的事件对象中的关于事件鼠标位置的几个属性(x, pageX, offsetX, scrrenX clientX)及(y, pageY, offsetY, screenY, cli ...