解决scala.collection.mutable.Map写入的问题

 更新时间:2021年06月10日 16:31:52   作者:Xkoney1028  
这篇文章主要介绍了解决scala.collection.mutable.Map写入的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在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)
}

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

相关文章

  • Java中的SynchronousQueue阻塞队列使用代码实例

    Java中的SynchronousQueue阻塞队列使用代码实例

    这篇文章主要介绍了Java中的SynchronousQueue阻塞队列使用代码实例,SynchronousQueue是无缓冲区的阻塞队列,即不能直接向队列中添加数据,会报队列满异常,需要的朋友可以参考下
    2023-12-12
  • java web激活邮箱并找回密码

    java web激活邮箱并找回密码

    这篇文章主要介绍了java web激活邮箱并找回密码,在项目中要实现用户注册的邮箱激活以及忘记密码重置密码功能,感兴趣的小伙伴们
    2015-11-11
  • Java 关于递归的调用机制精细解读

    Java 关于递归的调用机制精细解读

    关于递归是什么,简单的说: 递归就是方法自己调用自己,每次调用时 传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁
    2021-10-10
  • idea下载svn的项目并且运行操作

    idea下载svn的项目并且运行操作

    这篇文章主要介绍了idea下载svn的项目并且运行操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 浅谈java安全编码指南之死锁dead lock

    浅谈java安全编码指南之死锁dead lock

    java中为了保证共享数据的安全性,我们引入了锁的机制。有了锁就有可能产生死锁。死锁的原因就是多个线程锁住了对方所需要的资源,然后现有的资源又没有释放,从而导致循环等待的情况。通常来说如果不同的线程对加锁和释放锁的顺序不一致的话,就很有可能产生死锁。
    2021-06-06
  • springboot项目实现多数据源配置使用dynamic-datasource-spring-boot-starter的操作步骤

    springboot项目实现多数据源配置使用dynamic-datasource-spring-boot-starter

    这篇文章主要介绍了springboot项目实现多数据源配置使用dynamic-datasource-spring-boot-starter,本文分步骤结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java线程池的拒绝策略实现详解

    Java线程池的拒绝策略实现详解

    这篇文章主要介绍了Java线程池的拒绝策略实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • MyBatis-Plus之逻辑删除的实现

    MyBatis-Plus之逻辑删除的实现

    这篇文章主要介绍了MyBatis-Plus之逻辑删除的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java函数式编程(九):Comparator

    Java函数式编程(九):Comparator

    这篇文章主要介绍了Java函数式编程(九):Comparator,本文是系列文章的第9篇,其它文章请参阅本文底部的相关文章,需要的朋友可以参考下
    2014-09-09
  • Thread线程的基础知识及常见疑惑点总结

    Thread线程的基础知识及常见疑惑点总结

    在本篇内容里小编给大家分享的是关于Thread线程的基础知识及常见疑惑点,对此有学习需求的朋友们可以学习参考下。
    2019-05-05

最新评论