解决scala.collection.mutable.Map写入的问题
程序员文章站
2022-06-25 12:41:52
在scala中可变map写入使用val no2id = scala.collection.mutable.map[int,string]()no2id += (1 -> "something")...
在scala中可变map写入
使用
val no2id = scala.collection.mutable.map[int,string]() no2id += (1 -> "something")
而在以下代码中,map不能添加元素
val no2id = scala.collection.mutable.map[int,string]() sc.textfile(conf).foreach(line=>{ val splits = line.split(“,”) val no = splits(0).trim.toint val id = splits(1) no2id += (no -> id) })
其中conf文件为数字和对应的人名
把rdd使用collect转化成array后,可以向map添加元素
val no2id = scala.collection.mutable.map[int,string]() sc.textfile(conf).collect().foreach(line=>{ val splits = line.split(“,”) val no = splits(0).trim.toint val id = splits(1) no2id += (no -> id) })
scala中的map使用例子
map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于spark的底层语言是scala,所以有必要来了解下scala中的map使用方法。
(1)不可变map
特点:
api不太丰富
如果是var修饰,引用可变,支持读写
如果是val修饰,引用不可变,只能写入一次值,其后只读
var a:map[string,int]=map("k1"->1,"k2"->2)//初始化构造函数 a += ("k3"->3)//添加元素 a += ("k4"->4)//添加元素 a += ("k1"->100)//已经存在添加元素会覆盖 a -= ("k2","k1")//删除元素 // a("k1") = "foo"//不支持 println(a.contains("k6"))//是否包含某元素 println(a.size)//打印大小 println(a.get("k1").getorelse("default")) //根据key读取元素,不存在就替换成默认值 a.foreach{case (e,i) => println(e,i)} //遍历打印1 for( (k,v)<-a ) println(k,v) //遍历打印2 println(a.isempty)//判断是否为空 a.keys.foreach(println)//只打印key a.values.foreach(println)//只打印value a=map()//数据清空使用再次new println(a.size) a.toseq.sortby(_._1)//升序排序 key a.toseq.sortby(_._2)//升序排序 value a.toseq.sortwith(_._1>_._1) //降序排序 key a.toseq.sortwith(_._2>_._2) //降序排序 value //下面自定义按英文字母或数字排序 implicit val keyordering=new ordering[string] { override def compare(x: string, y: string): int = { x.compareto(y) } } println(a.toseq.sorted)
(2)可变map例子
特点:
api丰富与java中map基本类似
如果是var修饰,引用可变,支持读写
如果是val修饰,引用不可变,支持读写
def map3(): unit ={ //不可变map+var关键词修饰例子 var a:scala.collection.mutable.map[string,int]=scala.collection.mutable.map("k1"->1,"k2"->2)//初始化构造函数 a += ("k3"->3)//添加元素 a += ("k4"->4)//添加元素 a += ("k1"->100)//已经存在添加元素会覆盖 a += ("k1"->100,"k9"->9)//添加多个元素 a -= ("k2","k1")//删除元素 a ++= list("ca" -> 23, "co" -> 25)//追加集合 a --= list("al", "az")//删除集合 a.retain((k,v)=> k=="k1")//只保留等于k1元素,其他的删除 a.put("put1",200)//put a.remove("k2")//remove a.clear()//清空 a("k3")=100//支持 println(a.contains("k6"))//是否包含某元素 println(a.size)//打印大小 println(a.get("k1").getorelse("default")) //根据key读取元素,不存在就替换成默认值 a.foreach{case (e,i) => println(e,i)} //遍历打印1 for( (k,v)<-a ) println(k,v) //遍历打印2 println(a.isempty)//判断是否为空 a.keys.foreach(println)//只打印key a.values.foreach(println)//只打印value a=scala.collection.mutable.map()//引用能变 println(a.size) a.toseq.sortby(_._1)//排序 key a.toseq.sortby(_._2)//排序 value a.toseq.sortwith(_._1>_._1) //降序排序 key a.toseq.sortwith(_._2>_._2) //降序排序 value //下面自定义按英文字母或数字排序 implicit val keyordering=new ordering[string] { override def compare(x: string, y: string): int = { x.compareto(y) } } println(a.toseq.sorted) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
完美转换MySQL的字符集 解决查看utf8源文件中的乱码问题
-
解决yii2左侧菜单子级无法高亮问题的方法
-
mysql处理添加外键时提示error 150 问题的解决方法
-
mysql建库时提示Specified key was too long max key length is 1000 bytes的问题的解决方法
-
解决maven启动Spring项目报错的问题
-
IOS NSNotification 键盘遮挡问题的解决办法
-
spring容器初始化遇到的死锁问题解决
-
iOS中lebel特殊字符的自动换行问题解决
-
iOS 10拨打系统电话弹出框延迟出现问题的解决
-
解决Android从相册中获取图片出错图片却无法裁剪问题的方法