第1节 Scala基础语法:13、list集合的定义和操作;16、set集合;17、map集合
list.+:5 , list.::5: 在list集合头部添加单个元素5 ;
li1.:+(5):在list集合尾部添加单个元素5;
li1++li2,li1:::li2:在li1集合尾部添加il2集合;
li1.:::(li2):在li1集合头部添加li2集合。
li1--=li2:可变list集合li1中,减去li2集合中的元素,li1中的元素为减少后的元素。
List:可重复、有序(注意,这里的有序不是指它里面的元素从小到大排序,而是指它里面的元素的位置不会改变,每个元素都有自己的位置序号)、可保证插入顺序;
Set:不可重复、有序、但不保证插入顺序(即插入元素时是乱序的,随机插到一个位置);
Map:不可重复、有序、但不保证插入顺序。
========================================
5.4. 集合
Scala的集合有三大类:序列Seq、Set、映射Map,所有的集合都扩展自Iterable特质,在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)。
5.4.1. List
(1)不可变的序列 import scala.collection.immutable._
在Scala中列表要么为空(Nil表示空列表) 要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
list常用的操作符:
+: (elem: A): List[A] 在列表的头部添加一个元素
:: (x: A): List[A] 在列表的头部添加一个元素
:+ (elem: A): List[A] 在列表的尾部添加一个元素
++[B](that: GenTraversableOnce[B]): List[B] 从列表的尾部添加 另外一个列表
::: (prefix: List[A]): List[A] 在列表的头部添加另外一个列表
val left = List(1,2,3)
val right = List(4,5,6)
//以下操作等价
left ++ right // List(1,2,3,4,5,6)
right.:::(left) // List(1,2,3,4,5,6)
//以下操作等价
0 +: left //List(0,1,2,3)
left.+:(0) //List(0,1,2,3)
//以下操作等价
left :+ 4 //List(1,2,3,4)
left.:+(4) //List(1,2,3,4)
//以下操作等价
0 :: left //List(0,1,2,3)
left.::(0) //List(0,1,2,3)
例子:
package cn.itcast.collect
/**
* 不可变List集合操作
*/
object ImmutListDemo {
def main(args: Array[String]) {
//创建一个不可变的集合
val lst1 = List(1,2,3)
//补充:另一种定义list方法
val other_lst=2::Nil
//获取集合的第一个元素
val first=lst1.head
//获取集合中除第一个元素外的其他元素集合,
val tail=lst1.tail
//补充:其中如果 List 中只有一个元素,那么它的 head 就是这个元素,它的 tail 就是 Nil;
println(other_lst.head+"----"+other_lst.tail)
//将0插入到lst1的前面生成一个新的List
val lst2 = 0 :: lst1
val lst3 = lst1.::(0)
val lst4 = 0 +: lst1
val lst5 = lst1.+:(0)
//将一个元素添加到lst1的后面产生一个新的集合
val lst6 = lst1 :+ 3
val lst0 = List(4,5,6)
//将2个list合并成一个新的List
val lst7 = lst1 ++ lst0
//将lst0插入到lst1前面生成一个新的集合
val lst8 = lst1 ++: lst0
//将lst0插入到lst1前面生成一个新的集合
val lst9 = lst1.:::(lst0) println(other_lst)
println(lst1)
println(first)
println(tail)
println(lst2)
println(lst3)
println(lst4)
println(lst5)
println(lst6)
println(lst7)
println(lst8)
println(lst9)
}
}
(2)可变的序列 import scala.collection.mutable._
ackage cn.itcast.collect
import scala.collection.mutable.ListBuffer
object MutListDemo extends App{
//构建一个可变列表,初始有3个元素1,2,3
val lst0 = ListBuffer[Int](1,2,3)
//创建一个空的可变列表
val lst1 = new ListBuffer[Int]
//向lst1中追加元素,注意:没有生成新的集合
lst1 += 4
lst1.append(5)
//将lst1中的元素添加到lst0中, 注意:没有生成新的集合
lst0 ++= lst1
//将lst0和lst1合并成一个新的ListBuffer 注意:生成了一个集合
val lst2= lst0 ++ lst1
//将元素追加到lst0的后面生成一个新的集合
val lst3 = lst0 :+ 5
//删除元素,注意:没有生成新的集合
val lst4 = ListBuffer[Int](1,2,3,4,5)
lst4 -= 5
//删除一个集合列表,生成了一个新的集合
val lst5=lst4--List(1,2)
//把可变list 转换成不可变的list 直接加上toList
val lst6=lst5.toList
//把可变list 转变数组用toArray
val lst7=lst5.toArray
println(lst0)
println(lst1)
println(lst2)
println(lst3)
println(lst4)
println(lst5)
println(lst6)
println(lst7) }
5.4.2. Set
(1)不可变的Set import scala.collection.immutable._
Set代表一个没有重复元素的集合;将重复元素加入Set是没有用的,而且 Set 是不保证插入顺序的,即 Set 中的元素是乱序的。
定义:val set=Set(元素,元素,.....)
//定义一个不可变的Set集合 scala> val set =Set(1,2,3,4,5,6,7) set: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4) //元素个数 scala> set.size res0: Int = 7 //取集合最小值 scala> set.min res1: Int = 1 //取集合最大值 scala> set.max res2: Int = 7 //将元素和set1合并生成一个新的set,原有set不变 scala> set + 8 res3: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 8, 4) scala> val set1=Set(7,8,9) set1: scala.collection.immutable.Set[Int] = Set(7, 8, 9) //两个集合的交集 scala> set & set1 res4: scala.collection.immutable.Set[Int] = Set(7) //两个集合的并集 scala> set ++ set1 res5: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 9, 2, 7, 3, 8, 4) //在第一个set基础上去掉第二个set中存在的元素 scala> set -- set1 res6: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) //返回第一个不同于第二个set的元素集合 scala> set &~ set1 res7: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) //计算符合条件的元素个数 scala> set.count(_ >5) res8: Int = 2 /返回第一个不同于第二个的元素集合 scala> set.diff(set1) res9: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4) /返回第一个不同于第二个的元素集合 scala> set1.diff(set) res10: scala.collection.immutable.Set[Int] = Set(8, 9) //取子set(2,5为元素位置, 从0开始,包含头不包含尾) scala> set.slice(2,5) res11: scala.collection.immutable.Set[Int] = Set(6, 2, 7) //迭代所有的子set,取指定的个数组合 scala> set1.subsets(2).foreach(x=>println(x)) Set(7, 8) Set(7, 9) Set(8, 9) |
(2)可变的Set import scala.collection.mutable._
//导入包 scala> import scala.collection.mutable.HashSet import scala.collection.mutable.HashSet //定义一个可变的Set scala> val set1=new HashSet[Int]() set1: scala.collection.mutable.HashSet[Int] = Set() //添加元素 scala> set1 += 1 res1: set1.type = Set(1) //添加元素 add等价于+= scala> set1.add(2) res2: Boolean = true scala> set1 res3: scala.collection.mutable.HashSet[Int] = Set(1, 2) //向集合中添加元素集合 scala> set1 ++=Set(1,4,5) res5: set1.type = Set(1, 5, 2, 4) //删除一个元素 scala> set1 -=5 res6: set1.type = Set(1, 2, 4) //删除一个元素 scala> set1.remove(1) res7: Boolean = true scala> set1 res8: scala.collection.mutable.HashSet[Int] = Set(2, 4) |
5.4.3. Map
(1)不可变的Map import scala.collection.immutable._
定义Map集合 1.val map=Map(键 -> 值 , 键 -> 值...) 2.利用元组构建 val map=Map((键,值), (键,值) , (键,值)....) 展现形式: val map = Map(“zhangsan”->30,”lisi”->40) val map = Map((“zhangsan”,30),(“lisi”,40)) 3.操作map集合 获取值: 值=map(键) 原则:通过先获取键,在获取键对应值。 4.遍历map集合 scala> val imap=Map("zhangsan" -> 20,"lisi" ->30) imap: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 20, lisi -> 30) //方法一:显示所有的key scala> imap.keys res0: Iterable[String] = Set(zhangsan, lisi) //方法二:显示所有的key scala> imap.keySet res1: scala.collection.immutable.Set[String] = Set(zhangsan, lisi) //通过key获取value scala> imap("lisi") res2: Int = 30 //通过key获取value 有key对应的值则返回,没有就返回默认值0, scala> imap.getOrElse("zhangsan",0) res4: Int = 20 //没有对应的key,返回默认0 scala> imap.getOrElse("zhangsan1",0) res5: Int = 0 //由于是不可变map,故不能向其添加、删除、修改键值对 |
(2)可变的Map import scala.collection.mutable._
//导包 import scala.collection.mutable //声明一个可变集合 scala> val user =mutable.HashMap("zhangsan"->50,"lisi" -> 100) user: scala.collection.mutable.HashMap[String,Int] = Map(lisi -> 100, zhangsan -> 50) //添加键值对 scala> user +=("wangwu" -> 30) res0: user.type = Map(lisi -> 100, zhangsan -> 50, wangwu -> 30) //添加多个键值对 scala> user += ("zhangsan0" -> 30,"lisi0" -> 20) res1: user.type = Map(zhangsan0 -> 30, lisi -> 100, zhangsan -> 50, lisi0 -> 20,wangwu -> 30) //方法一:显示所有的key scala> user.keys res2: Iterable[String] = Set(zhangsan0, lisi, zhangsan, lisi0, wangwu) //方法二:显示所有的key scala> user.keySet res3: scala.collection.Set[String] = Set(zhangsan0, lisi, zhangsan, lisi0, wangwu) //通过key获取value scala> user("zhangsan") res4: Int = 50 //通过key获取value 有key对应的值则返回,没有就返回默认值0, scala> user.getOrElse("zhangsan",0) res5: Int = 50 //没有对应的key,返回默认0 scala> user.getOrElse("zhangsan1",0) res6: Int = 0 //更新键值对 scala> user("zhangsan") = 55 scala> user("zhangsan") res8: Int = 55 //更新多个键值对 scala> user += ("zhangsan" -> 60, "lisi" -> 50) res9: user.type = Map(zhangsan0 -> 30, lisi -> 50, zhangsan -> 60, lisi0 -> 20,wangwu -> 30) //删除key scala> user -=("zhangsan") res14: user.type = Map(zhangsan0 -> 30, lisi -> 50, lisi0 -> 20, wangwu -> 30) //删除key scala>user.remove("zhangsan0") //遍历map 方法一:通过key值 scala> for(x<- user.keys) println(x+" -> "+user(x)) lisi -> 50 lisi0 -> 20 wangwu -> 30 //遍历map 方法二:模式匹配 scala> for((x,y) <- user) println(x+" -> "+y) lisi -> 50 lisi0 -> 20 wangwu -> 30 //遍历map 方法三:通过foreach scala> user.foreach{case (x,y) => println(x+" -> "+y)} lisi -> 50 lisi0 -> 20 wangwu -> 30 |
第1节 Scala基础语法:13、list集合的定义和操作;16、set集合;17、map集合的更多相关文章
- 第1节 Scala基础语法:5、6、7、8、基础-申明变量和常用类型,表达式,循环,定义方法和函数
4. Scala基础 4.1. 声明变量 package cn.itcast.scala object VariableDemo { def main(args: Array[Strin ...
- 第1节 Scala基础语法:scala中的方法源码分析
val list=List(1,2,3,4) list.reduce((x:Int,y:Int)=>x+y)--->list.reduceLeft((x:Int,y:Int)=>x+ ...
- 第1节 Scala基础语法:11、映射;12、元组
5.2. 映射 在Scala中,把哈希表这种数据结构叫做映射. 1.1.1. 构建映射 (1)构建映射格式 1.val map=Map(键 -> 值,键 -> 值....) 2. ...
- 第1节 Scala基础语法:9、10、数组
1. 定义数组时,没有new和有new是有区别的: scala> val arr3 = Array[Int](2) 此时,arr3中仅包含1个元素2arr3: Array[Int] = A ...
- 第1节 Scala基础语法:3、环境;4、插件
1. Scala编译器安装 1.1. 安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 1.2. 安装Scala 1.2.1. Windows ...
- 第1节 Scala基础语法:1、2、概述,什么是scala
Scala编程 1. 课程目标 1.1. 目标1:熟练使用scala编写Spark程序 1.2. 目标2:动手编写一个简易版的Spark通信框架 1.3. 目标3:为阅读Spark内核源码 ...
- 第1节 Scala基础语法:14、15、list集合练习
package cn.itcast.collect /** *作业题 */object ListTest { def main(args: Array[String]): Unit = { //创建一 ...
- 1.scala基础语法总结
Scala基础语法总结:Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的.如果一行里写多个语句那么分号是需要的 val s = "菜鸟教程"; pr ...
- 【Scala学习之一】 Scala基础语法
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
随机推荐
- POCO的理解
POCO的名称有多种,pure old clr object. plain ordinary clr object等 POCO的概念是指那些没有从任何类继承,也没有实现任何接口,更没有被其它框架侵入的 ...
- 使用python同时替换json多个指定key的value
1.如何同时替换json多个指定key的value import json from jsonpath_ng import parse def join_paths(regx_path,new_val ...
- 深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件
dispatch.wndproc是VCL framework在TWinCtronl定义的虚拟方法,下面程序通过重写(override)这两函数拦截WM_LBUTTONDOWN消息,来与Applicat ...
- [Jenkins] Jenkins的启动停止并修改默认端口
在Win系统下面,经常使用Jenkins今天自动化测试工作,但是在搭建的时候还是有些坑 1.选择性安装: 一般会选择windows,会下载一个压缩包,然后step by step就可以安装成功,这个方 ...
- cent os 7.3修改mac地址方法
一.修改MAC地址方法 linux环境下: 需要用 #ifconfig eth0 down 先把网卡禁用 再用ifconfig eth0 hw ether 1234567890ab ...
- VM虚拟机黑屏 鼠标进不去
#开始 可能是我脸黑吧 最近用虚拟机好几次都是黑屏 鼠标进不去 但是任务管理器显示确实有资源消耗 也就是说实际上应该是开机成功了(但是听不到声音 也许是没有开机吧) #解决方案 管理员权限打开 cmd ...
- mysql成功的远程连接
1.在虚拟机上的window7中安装mysql,版本mysql-5.7.27-win32,可以是解压版或者是安装版的, MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi ...
- C语言:去除一个字符串中所有的空格。-函数fun传入形参m,求t=1/2-1/3+1/4.....+1/m的值。-判断形参a指定的矩阵是不是“幻方“。
//函数fun功能:判断形参a指定的矩阵是不是“幻方“,若是返回1.(”幻方”:每列,每行,对角线,反对角线相加都相等) #include <stdio.h> #define N 3 in ...
- 如何在应用程序中使用ML.NET?
https://www.cnblogs.com/shanyou/p/9190701.html ML.NET以NuGet包的形式提供,可以轻松安装到新的或现有的.NET应用程序中. 该框架采用了用于其他 ...
- ASP.NET Core搭建多层网站架构【9.1-使用Autofac代替原生的依赖注入】
2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1 摘要:基于ASP.NET Core ...