解决scala.collection.mutable.Map写入的问题
程序员文章站
2022-03-11 13:10: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) }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 远程桌面时怎么复制粘贴文件?
推荐阅读
-
解决3.01版的jquery.form.js中文乱码问题的解决方法_jquery
-
MySQL中NOT IN填坑之列为null的问题解决
-
解决v-for中使用v-if或者v-bind:class失效的问题
-
vue解决弹出蒙层滑动穿透问题的方法
-
解决vue-cli webpack打包后加载资源的路径问题
-
UTF-8转GBK编码问题,有什么好的解决方案?
-
解决pandas read_csv 读取中文列标题文件报错的问题
-
解决drush PDOException: SQLSTATE[HY000] [2002]问题的办法分析
-
Bigcommerce:config.php的配置有关问题:无法写入自定义的新的配置信息
-
MySQL命令行乱码问题的解决_MySQL