欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决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)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。