Scala编程基础3 数组、映射、元组、集合

Scala编程基础3 数组、映射、元组、集合

小白的Scala学习笔记 2024/5/23 14:20

文章目录

  • Scala编程基础3 数组、映射、元组、集合
    • apply方法
    • 数组
      • yield
    • 数组的一些方法
    • 映射
    • 元组
    • 数据类型转换
    • 求和示例
    • 拉链
    • 集合
      • flatMap方法
    • Set
    • HashMap

apply方法

可以new,也可以不new,不new的时候就调用apply方法

B

class B {def add()={println("add")}
}object B{
//是一个特殊方法,可以认为是构造方法,当没有new的时候,自动调用这个方法def apply()={new B()}
}

TestB

object TestB {def main(args: Array[String]): Unit = {val b=new B()b.add()val b1=B()b1.add()}
}

结果

在这里插入图片描述

数组

定长、变长

import scala.collection.mutable.ArrayBufferobject Test14 {def main(args: Array[String]): Unit = {//定长//为什么不用new? 实现任何都要new,因为有apply方法val array=Array("a","f","dd")println(array.toBuffer)//变长val array1 = new ArrayBuffer[String]()array1.append("aa1")array1.append("aa2")array1.append("aa3")array1.append("aa4")println(array1)}
}

用ArrayBuffer实现增删改查,主要目的是熟练语法

import java.util.Scanner
import scala.collection.mutable.ArrayBufferobject TestArrayBuffer {val scanner = new Scanner(System.in)var array = new ArrayBuffer[String]()def add()={var addflag=truewhile (addflag){println("输入E退出")var input=scanner.nextLine()if(input.equals("E"))addflag=falseelse array.append(input)}}def delete()={println("请输入要删除的数据:")var delval=scanner.nextLine()val i = array.indexOf(delval)//找到要删除的值的序号if(i != -1)array.remove(i)else println("不存在该值")}def update()={println("请输入要修改的数据:")var updateval=scanner.nextLine()val i = array.indexOf(updateval)//找到要修改的值的序号if(i != -1){println("请输入新的值:")array(i)=scanner.nextLine()}else println("不存在该值")}def select()={for(elm <- array){println(elm)}}def main(args: Array[String]): Unit = {var isflag=truewhile (isflag){println()println("输入“quit”退出系统")println("1.添加 2.删除 3.修改 4.查询")var choiceType = scanner.nextLine()if(choiceType.equals("quit")){isflag=false}if(choiceType.equals("1"))add()if(choiceType.equals("2"))delete()if(choiceType.equals("3"))update()if(choiceType.equals("4"))select()}}
}

yield

对数组中每一个数进行处理

yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变

object Test15 {def main(args: Array[String]): Unit = {val array = Array(5,6,7,8,9)val sm=for(elm <- array) yield elm*2sm.foreach(x => println(x))println("==============")array.foreach(x => println(x))}
}

数组的一些方法

object Test16 {def main(args: Array[String]): Unit = {val array = Array(3,5,34,62,2)array.foreach(x => println(x))//输出println("=================")val array2 = array.map(x => x+12)//每个值加12array2.foreach(x => println(x))println("=================")val array3 =array.sortBy(x => (-x))//按照-x值排序,结果是降序array3.foreach(x=>println(x))println("=================")array.reverse.foreach(x=>println(x))//反转println("=================")array.sorted.foreach(x=>println(x)) //排序println("=================")array.sorted.reverse.foreach(x=>println(x))//排序后反转,实现降序println("=================")println(array.reduce((a, b) => {println(a,b);  a+ b}))//全部值求和}
}
object Test18
{def main(args: Array[String]): Unit = {//没有new的话,不能追加,可以更改val array=Array("zhangsan,lisi","wangwu,zhaoliu")val stringses = array.map(x => x.split(","))//把每个值按”,“分开for (elm <- stringses){for (i <- elm){println(i)}}}
}

映射

映射相当于java中的HashMap

不能追加、修改

object Test17 {def main(args: Array[String]): Unit = {//没有new的话是不能追加,也不能修改的val m=Map("22"->"zhangsan","33"->"lisi")println(m("22"))//取key为22的值for (elm <- m.keys){println(elm,m(elm))}}
}

可以追加、修改

package com.oracle.jt
import scala.collection.mutable.Map//mutable包下的Map可以追加、修改object Test19 {def main(args: Array[String]): Unit = {val map=Map[String,String]()map.+=(("22","zhangsan"))//添加值map.+=(("33","lisi"))map.+=(("44","jjfj"))map("44")="nnnn"//修改for (elm <- map.keys){println(elm,map(elm))}val value1 = map.get("22")//如果输入的key不存在,就会报错println(value1.get)//返回值是Optionval value2 =map.getOrElse("44","default")// 如果输入的key不存在,会输出default,不会报错println(value2)}
}

求单词出现次数

package com.oracle.jt
import scala.collection.mutable.Mapobject Test21 {def main(args: Array[String]): Unit = {val str="hello,tom,jerry,tom,hello"val strings = str.split(",")//分割//变成(键,1);按键分组,变成(键,(键,1));变成(键,(键,1)取第二列、求和)val res= strings.map(x=>(x,1)).groupBy(x=>x._1).map(x=>(x._1,x._2.map(x=>x._2).sum))println(res)val tuples: Array[(String, Int)] = strings.map(x => (x, 1))//变成(键,1)val stringToTuples: Predef.Map[String, Array[(String, Int)]] = tuples.groupBy(x => x._1)//按键分组,变成(键,(键,1))val result: Predef.Map[String, Int] = stringToTuples.map(x => (x._1, x._2.map(x => x._2).sum))//变成(键,(键,1)取第二列、求和)println(result)}
}

元组

package com.oracle.jtobject TestYuanZu {def main(args: Array[String]): Unit = {val tuple=(2,3,4)println(tuple._1,tuple._2,tuple.x)val tuple2=(2.22,3.33)println(tuple2._2)val tuple3=("zhangsan","lisi")println(tuple3._2)val array=Array("zhangsan",2,44,"lisi",true,2.22)println(array(2))}
}

数据类型转换

直接to

package com.oracle.jtobject Test22 {def main(args: Array[String]): Unit = {// 2个元素的元组,可以看成kv对val list=Array(("22","zhangsan"),("33","lisi"))val map = list.toMapprintln(map)val s="444"val int = s.toIntprintln(int)val lng=3333933L;val int1 = lng.toIntprintln(int1)val float = lng.toFloatprintln(float)val a="23"val b="34"val sum = a.toInt + b.toIntprintln(sum)}
}

求和示例

package com.oracle.jt
import scala.collection.mutable.Map
object TestArray2 {def main(args: Array[String]): Unit = {//按 键 求和val array=Array(("22",12),("33",12),("22",244),("33",19))val stringToInt = array.groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))println(stringToInt)//也是求和,跟上面一样val map=Array(("2020-12-12",22),("2020-12-12",88),("2020-12-13",333),("2020-12-13",56))val stringToInt1 = map.groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))println(stringToInt1)//起始是字符串val order="2020-12-12,23#2020-12-12,55#2020-12-14,89#2020-12-14,66"val orderArray = order.split("#").map(x => x.split(","))
//    for(elm <- orderArray){
//      println(elm.toBuffer)
//    }val tuples: Array[(String, Int)] = orderArray.map(x => (x(0), x(1).toInt))//把Array转换成元组val stringToInt2 = tuples.groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))println(stringToInt2)// 求每个城市上网的浏览时间val session="济南,火狐,9#济南,谷歌,15#南宁,谷歌,60"val stringses: Array[Array[String]] = session.split("#").map(x => x.split(","))val stringToInt3: Predef.Map[String, Int] = stringses.map(x => (x(0), x(2).toInt)).groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))println(stringToInt3)val stringToInt4: Predef.Map[String, Int] = stringses.map(x => (x(1), x(2).toInt)).groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))println(stringToInt4)}
}

拉链

两个数组,下标相同的数据合成一个元组,形成一个新的数组

package com.oracle.jtobject TestLaLian {def main(args: Array[String]): Unit = {val array1=Array("zhangsan","lisi")val array2=Array("你好","你坏")val tuples: Array[(String, String)] = array1.zip(array2)tuples.foreach(x=>println(x))}
}

集合

Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质

在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)

flatMap方法

object TestList1 {def main(args: Array[String]): Unit = {//拉平,把每个元素分隔开,存到一个新的List中val list = List("hello,tom","hello,jerry","tom,marry")val strings: List[String] = list.flatMap(x => x.split(","))strings.foreach(x=>println(x))//结果:hello,tom,hello,jerry,tom,marryprintln("+++++++++++++++++")//分割成每个元素后,每个元素变成kv对(元组)val array=List("hello#tom","hello#jerry","tom#marry")val tuples: List[(String, Int)] = array.flatMap(x => x.split("#")).map(x => (x, 1))tuples.foreach(x=>println(x))//结果:(hello,1)//(tom,1)//(hello,1)//(jerry,1)//(tom,1)//(marry,1)}
}
import scala.collection.mutable.ListBufferobject TestList2 {def main(args: Array[String]): Unit = {val listBuffer = new ListBuffer[String]()//能追加元素listBuffer.+=("hello jerry")listBuffer.++=(Array("hello marry","tom jerry"))listBuffer.foreach(x=>println(x))//统计单词出现次数val tuples: ListBuffer[(String, Int)] = listBuffer.flatMap(x => x.split(" ")).map(x => (x, 1))val res = tuples.groupBy(x => x._1).map(x => (x._1, x._2.map(x => x._2).sum))res.foreach(x=>println(x))}
}

Set

object TestSet1 {def main(args: Array[String]): Unit = {val set=Set(1,1,2,90,2)//去重了,所以只有1,2,90println(set.sum)//93println("=======================")set.foreach(x=>println(x))//1//2//90println("=======================")set.map(x=>x*3).foreach(x=>println(x))//3//6//270println("=======================")println(set.reduce((a, b) => a * b))//累乘的结果//180}
}
import scala.collection.mutableobject TestSet2 {def main(args: Array[String]): Unit = {val set: mutable.HashSet[String] = new mutable.HashSet[String]()set.+=("u01,zhangsan")set.+=("u02,lisi")set.+=("u01,zhangsan")set.foreach(x=>println(x))val uNumber: mutable.HashSet[String] = set.map(x => x.split(",")).map(x => x(0))//把用户id取出来println(uNumber.size)println(set.size)println("=================")val ss=new mutable.HashSet[Int]()ss.add(4)//添加元素ss.+=(9)//添加元素ss.foreach(x=>println(x))ss.-=(9)//删除元素ss.foreach(x=>println(x))}
}

HashMap

import scala.collection.mutable
object TestHashMap1 {def main(args: Array[String]): Unit = {val map = new mutable.HashMap[String,Int]()map.+=(("22",1))//添加数据map.+=(("23",44))map.put("21",99)map.foreach(x=>println(x))val ints: mutable.Iterable[Int] = map.map(x => x._2)ints.foreach(x=>println(x))val tuple: (String, Int) = map.reduce((x, y) => (x._1, x._2 + y._2))println(tuple)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink Jobmanager metaspace oom 分析

文章目录 现象作业背景分析现象分析类卸载条件MAT 分析 解决办法flink 官方提示 现象 通过flink 页面提交程序&#xff0c;多次提交后&#xff0c;jobmanager 报metaspace oom 作业背景 用户代码是flink 代码Spring nacos 分析 现象分析 从现象来看肯定是因为有的类没有被…

Linux系统-前台任务组,后台任务组

文章目录 前台进程后台进程新命令jobsfg 【后台进程组序号】ctrlz组合键信号 和 bg命令ctrlz组合键信号bg 【后台进程组序号】 session会话此时我们关闭本次的会话&#xff0c;我们的后台进程是否也会退出呢&#xff1f; 总结 前台进程 在我们远程登录Linux服务器后&#xff0…

创建__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在创建类后&#xff0c;可以手动创建一个__init__()方法。该方法是一个特殊的方法&#xff0c;类似Java语言中的构造方法。每当创建一个类的新实例时…

【AI界的狼人杀】人工智能“反图灵测试”实验

5月28日&#xff0c; AI Power Users、Unity 独立开发者&#xff1a;Tore Knabe 在其社交平台发布了一则名为《Reverse Turing Test Experiment with AIs》的视频&#xff0c;立马引发了热议。 视频中共出现了五位主要角色&#xff0c;“他们”分别是&#xff1a;亚里士多德&am…

961操作系统知识总结

部分图片可能无法显示&#xff0c;参考这里&#xff1a;https://zhuanlan.zhihu.com/p/701247894 961操作系统知识总结 一 操作系统概述 1. 操作系统的基本概念 重要操作系统类型&#xff1a;批处理操作系统(批量处理作业&#xff0c;单道批处理/多道批处理系统&#xff0c;用…

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…

夜天之书 #98 Rust 程序库生态合作的例子

近期主要时间都在适应产品市场&#xff08;Product Marketing&#xff09;的新角色&#xff0c;不少想法还在酝酿和斟酌当中&#xff0c;于是文章输出没有太多时间来推敲和选题&#xff0c;只能保持每月发布相关的进展或一些零碎的思考。或许我可以恢复最早的模式&#xff0c;多…

YOLOv8改进(一)-- 轻量化模型ShuffleNetV2

文章目录 1、前言2、ShuffleNetV2代码实现2.1、创建ShuffleNet类2.2、修改tasks.py2.3、创建shufflenetv2.yaml文件2.4、跑通示例 3、碰到的问题4、目标检测系列文章 1、前言 移动端设备也需要既准确又快的小模型。为了满足这些需求&#xff0c;一些轻量级的CNN网络如MobileNe…

十_信号4-SIGCHLD信号

SIGCHLD信号 在学习进程控制的时候&#xff0c;使用wait和waitpid系统调用何以回收僵尸进程&#xff0c;父进程可以阻塞等待&#xff0c;也可以非阻塞等待&#xff0c;采用轮询的方式不停查询子进程是否退出。 采用阻塞式等待&#xff0c;父进程就被阻塞了&#xff0c;什么都干…

力扣83. 删除排序链表中的重复元素

Problem: 83. 删除排序链表中的重复元素 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义快慢指针fast、slow均指向head&#xff1b; 2.每次fast后移一位&#xff0c;当fast和slow指向的节点值不一样时&#xff0c;将slow.next指向fast同时使slow指向fast&#xff1b; 3…

MyBatis框架-开发方式+参数传递+#{}、${}+返回值处理+查询结果封装为对象+resultType

一、开发方式 MyBatis-Dao层Mapper接口化开发 二、注意事项 1、Mapper接口与Mapper.xml映射文件要满足4个对应 &#xff08;1&#xff09;Mapper接口的全类名必须与Mapper映射文件中的namespace相同 &#xff08;2&#xff09;Mapper接口中的每一个方法名在Mapper映射文件…

回溯算法之电话号码字母组合

题目&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "2…

Java web应用性能分析之【jvisualvm远程连接云服务器】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 前面整理了java进程问题分析和分析工具&#xff0c;现在可以详细看看jvisualvm的使用&#xff0c;一般java进程都是部署云服务器&#xff0c;或者托管IDC机…

每周统计-20240531

用于测试程序的稳定性&#xff1a; 龙虎榜&#xff1a; 成交额&#xff1a; 封成比&#xff1a; 收盘前放量&#xff1a; 开盘抢筹&#xff1a; 封单额&#xff1a;

论文阅读:Correcting Motion Distortion for LIDAR HD-Map Localization

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址&#xff1a;http://arxiv.org/pdf/2308.13694.pdf 代码地址&#xff1a;https://github.com/mcdermatt/VICET 概要 激光雷达的畸变矫正是一个非常重要的工作。由于扫描式激光雷达传感器需要有限的时间来创建…

linux命令:调试必备工具dmesg

在服务器上进行芯片调试时&#xff0c;我们会遇到各种各样的问题&#xff0c;很多问题与操作系统相关。此时就需要了解操作系统发生了哪些事件。 dmesg 是linux系统中用来打印或控制内核缓冲区内容的命令。这个环形缓冲区记录了系统启动以来发生的各种事件消息&#xff0c;包括…

ChatTTS改良版 - 高度逼真的人类情感文本生成语音工具(TTS)本地一键整合包下

先介绍下ChatTTS 和之前发布的 Fish Speech 类似&#xff0c;都是免费开源的文本生成语音的AI软件&#xff0c;但不同的是&#xff0c;ChatTTS测试下来&#xff0c;对于人类情感语调的模仿&#xff0c;应该是目前开源项目做的最好的&#xff0c;是一款高度接近人类情感、音色、…

WordPress中借助Table of Contents Plus+Widget Options插件,实现仅在文章侧边栏显示文章目录的功能

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;今天心血来潮&#xff0c;写了一篇文章&#xff0c;忽然发现自己的文章极少有目录&#xff0c;这对于长文章的阅读来说是十分不利的&#…

【自动驾驶】针对低速无人车的线控底盘技术

目录 术语定义 一般要求 操纵装置 防护等级 识别代号 技术要求 通过性要求 直线行驶稳定性 环境适应性要求 功能安全要求 信息安全要求 故障处理要求 通信接口 在线升级(OTA) 线控驱动 动力性能 驱动控制响应能力 线控制动 行车制动 制动响应能力 线控转向 总体要求 线控…

车联网安全入门——ICSim模拟器使用

文章目录 车联网安全入门——ISCim模拟器使用介绍主要特点&#xff1a;使用场景&#xff1a; 安装使用捕获can流量candumpcansnifferwiresharkSavvyCAN主要特点&#xff1a;使用场景&#xff1a; 重放can报文cansendSavvyCAN 总结 车联网安全入门——ISCim模拟器使用 &#x1…