Spark大数据分析与实战笔记(第一章 Scala语言基础-3)

news2024/11/25 12:57:04

文章目录

  • 1.3 Scala的数据结构
    • 1.3.1 数组
        • 数组的遍历
        • 数组转换
    • 1.3.2 元组
        • 创建元组
        • 获取元组中的值
        • 拉链操作
    • 1.3.3 集合
        • List
        • Set
        • Map

1.3 Scala的数据结构

对于每一门编程语言来说,数组(Array)都是重要的数据结构之一,主要用来存储数据类型相同的元素。Scala中的数组分为定长数组和变长数组,定义定长数组,需要使用new关键字,而定义变长数组时,则需要导包import scala.collection.mutable.ArrayBuffer。

1.3.1 数组

数组(Array)主要用来存储数据类型是每个人元素。

  • 数组定义与使用
    Scala中的数组分为定长数组和变长数组,这两种数组的定义方式如下:

  • 定义定长数组
    New Array[T] (数组长度) //定义定长数组

  • 定义变长数组
    ArrayBufferT //定义变长数组

注:定义定长数组,需要使用new关键字,而定义变长数组时,则需要导包import scala.collection.mutable.ArrayBuffer。

下面,通过一个例子来演示Scala数组简单使用,具体代码如下所示。

package cn.itcast.scala

import scala.collection.mutable.ArrayBuffer

object Ch01_ArrayDemo {

  def main(args: Array[String]): Unit = {

    //定义定长数组:定义长度为8的定长数组,数组中的每个元素初始化为0

    val arr1 = new Array[Int](8)

    //打印数组,内容是数组的hashcode值

    println(arr1)

//定义变长数组(数组缓冲),需要导入包:import scala.collection.mutable.ArrayBuffer

    val arr2 = ArrayBuffer[Int]()

    //向变长数组中追加元素

    arr2 += 1

    //打印变长数组

    println(arr2)

    //向变长数组中追加多个元素

    arr2 += (2,3,4,5)

    println(arr2)

    //追加一个定长数组

    arr2 ++= Array(6,7)

    println(arr2)

    //追加一个变长数组(数组缓冲)

    arr2 ++= ArrayBuffer(8,9)

    println(arr2)

    //在变长数组的某个位置插入元素

    arr2.insert(0,-1,0)

    println(arr2)

    //删除数组的某个元素

    arr2.remove(0)

    println(arr2)

  }

}

数组的遍历

Scala中,如果想要获取数组中的每一个元素,则需要将数组进行遍历操作。代码如下:

package cn.itcast.scala

object Ch02_ArrayTraversal {

  def main(args: Array[String]): Unit = {

    //定义定长数组

    //val array = new Array[Int](8) //方式1

    val myArr = Array(1.9, 2.9, 3.4, 3.5) //方式2

    //打印输出数组中的所有元素

    for(x<-myArr){

      print(x+" ")

    }

    println()

    //计算数组中所有元素的和

    var total = 0.0

    for(i <- 0 to (myArr.length-1)){

      total += myArr(i)

    }

    println("总和为:"+total)

    //查找数组中的最大值

    var max = myArr(0)

    for(i <- 1 to (myArr.length-1)){

      if(max < myArr(i)){

        max = myArr(i)

      }

    }

    println("最大值为:"+max)

  }

}

数组转换

数组转换就是通过yield关键字将原始的数组进行转换,会产生一个新的数组,然而原始的数组保持不变。定义一个数组,实现将偶数取出乘以10后生成一个新的数组,具体代码如下所示:

package cn.itcast.scala

object Ch03_ArrayYieldTest {

  def main(args: Array[String]): Unit = {

    //定义一个数组

    var arr = Array(1,2,3,4,5,6,7,8,9)

    //将偶数取出乘以10后再生成一个新的数组

    val newArr = for (e <- arr if e%2 == 0) yield e * 10

    println(newArr.toBuffer) //将定长数组转为变长数组

  }

}

1.3.2 元组

Scala的元组是对多个不同类型对象的一种简单封装,它将不同的值用小括号括起来,并用逗号作分隔,即表示元组。

创建元组

创建元组的语法格式如下:

  val tuple=(元素,元素...)

下面,通过简单的例子进行演示创建元组,例如:创建一个包含String类型、Double类型以及Int类型的元组,具体代码如下:

scala> val tuple = ("itcast",3.14,65535)

tuple: (String, Double, Int) = (itcast,3.14,65535)

获取元组中的值

在Scala中,获取元组中的值是通过下划线加脚标(例如:tuple._1,tuple._2)来获取的,元组中的元素脚标是从1开始的。代码如下:

scala> tuple._1                         # 获取第一个值

res0: String = itcast

scala> tuple._2                         # 获取第一个值

res1: Double = 3.14

拉链操作

在Scala的元组中,可以通过使用“zip”命令将多个值绑定在一起。例如,定义两个数组,分别是score和names,将这两个数组捆绑在一起,具体代码如下:

scala> val scores = Array(88,95,80)

scores: Array[Int] = Array(88, 95, 80)

scala> val names =Array("zhangsan","lisi","wangwu")

names: Array[String] = Array(zhangsan, lisi, wangwu)

scala> names.zip(scores)

res2: Array[(String, Int)] = Array((zhangsan,88), (lisi,95), (wangwu,80))

注:当两个数组个数不等时,会自动适配较短长度,多余元素无相应匹配元素会被自动抛弃。

1.3.3 集合

在Scala中,集合有三大类: List、Set以及Map,所有的集合都扩展自Iterable特质。

Scala 集合分为可变的(mutable)和不可变(immutable)的集合。其中,可变集合可以在适当的地方被更新或扩展,意味着可以对集合进行修改、添加、移除元素;不可变集合类,相比之下,初始化后就永远不会改变。

List

在Scala中,List列表和数组类似,列表的所有元素都具有相同类型。然而,列表与数组不同的是,列表是不可变的。

定义不同类型列表List,具体代码如下:

// 字符串

val fruit: List[String] =List("apples","oranges","pears")

// 整型

val nums: List[Int] = List(1, 2, 3, 4)

// 空

val empty: List[Nothing] = List()

// 二维列表

val dim: List[List[Int]] =

            List(

            List(1, 0, 0),

            List(0, 1, 0),

            List(0, 0, 1)

 )

在Scala中,可以使用“Nil”和“::”操作符来定义列表。代码如下:

// 字符串

val fruit = "apples":: ("oranges":: ("pears" :: Nil))

// 整型

val nums = 1 :: (2 :: (3 :: ( 4 :: Nil)))

// 空列表

val empty = Nil

// 二维列表

val dim = (1 :: (0 :: (0 :: Nil))) ::

                (0 :: (1 :: (0 :: Nil))) ::

                (0 :: (0 :: (1 :: Nil))) :: Nil

Scala也提供了很多操作List的方法,如下表所示。
在这里插入图片描述
示例代码如下:

package cn.itcast.scala

object Ch04_ListTest {

  def main(args: Array[String]): Unit = {

    //定义List集合

    //val fruit:List[String] = List("apples","oranges","pears")

    val fruit = "apples"::("oranges"::("pears"::Nil))

    val nums = Nil

    println("Head of fruit:" + fruit.head)

    println("Tail of fruit:" + fruit.tail)

    println("check if fruit is empty:"+fruit.isEmpty)

    println("check if nums is empty:"+nums.isEmpty)

    println("Take of fruit:"+fruit.take(2))

    println("contains of fruit oranages:"+fruit.contains("oranges"))

  }

}

Set

在Scala中,Set是没有重复对象的集合,所有元素都是唯一的。默认情况下,Scala 使用不可变Set集合,若想使用可变的Set集合,则需要引入 scala.collection.mutable.Set 包。

定义Set集合的语法格式如下:

val set: Set[Int] = Set(1,2,3,4,5)

Scala提供了很多操作Set集合的方法。接下来,我们列举一些操作Set集合的常见方法,具体如下表所示。
在这里插入图片描述
具体代码如下所示:

package cn.itcast.scala

object Ch05_SetTest {

  def main(args: Array[String]): Unit = {

    //定义Set集合

    val site = Set("Itcast","Google","Baidu")

    val nums:Set[Int] = Set()

    println("第一个网站是:"+site.head)

    println("最后一个网站是:"+site.tail)

    println("site集合是否为空:"+site.isEmpty)

    println("nums集合是否为空:"+nums.isEmpty)

    println("查看site集合的前两个网站:"+nums.take(2))

    println("site集合中是不包含网站Google:"+site.contains("Google"))

  }

}

Map

在Scala中,Map是一种可迭代的键值对(key/value)结构,并且键是唯一的,值不一定是唯一的,所有的值都是通过键来获取的。Map中所有元素的键与值都存在一种对应关系,这种关系即为映射。Map有两种类型,可变集合与不可变集合,默认是不可变Map。若需要使用可变的Map集合,则需要引入 import scala.collection.mutable.Map 类。

定义Map集合的语法格式如下:

var A:Map[Char,Int] = Map(键 -> 值,键 -> 值...)  //Map键值对,键为Char,值为Int

Scala也提供了很多操作Map集合的方法。接下来,我们列举一些操作Map集合的常见方法,具体如下表所示:
在这里插入图片描述
示例代码如下所示:

package cn.itcast.scala

object Ch06_MapTest {

  def main(args: Array[String]): Unit = {

    //定义Map集合

    val colors = Map("red"-> "#FF0000",

      "azure"-> "#F0FFFF",

      "peru"-> "#CD853F")

    val peruColor = if(colors.contains("peru")) colors("peru") else 0

    val azureColor = colors.getOrElse("azure",0)

    println("获取colors中键为red的值:"+colors("red"))

    println("获取colors中所有的键:"+colors.keys)

    println("获取colors中所有的值:"+colors.values)

    println("检测colors是否为空:"+colors.isEmpty)

    println("判断colors中是否包含键peru,包含则返回对应的值,否则返回0:"+peruColor)

    println("判断colors中是否包含键azure,包含则返回对应的值,否则返回0:"+azureColor)

  }

}

转载自:https://blog.csdn.net/u014727709/article/details/131679759

欢迎start,欢迎评论,欢迎指正

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

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

相关文章

C# OpenCvSharp 通道分离

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions;namespac…

栅栏状蚀刻铜箔上的掺氟碳量子点界面层

引言 由于其卓越的能量密度和长寿命&#xff0c;锂离子电池(LIBs)广泛用于电动设备&#xff0c;如军用无人机、电动车辆和动力辅助服&#xff0c;这些设备需要高重量或体积能量密度。然而&#xff0c;尽管在各种电动装置中使用&#xff0c;它们仍然具有关键的问题&#xff0c;…

达观RPA实战-自定义控件基础

一、应用背景 当标准控件和实际需求相差较大时,可以设计自定义控件。 或者有些通用功能,也可以做成自定义控件调用,如EXCEL文件表头填充 或者是有些标准控件实际运行会出错,无法解决,如FTP下载控件。 二、知识介绍 在开始开发自定义控件前,先简要介绍几个相关知识: …

C#,数值计算——Midsqu的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midsqu : Midpnt { private double borig { get; set; } 0.0; public new double func(double x) { return 2.0 * x * funk.funk(borig - x * x); } pub…

Mybatis 动态SQL – 使用if,set标签动态生成更新语句

上一篇我们介绍了使用Mybatis提供的if,where标签动态生成条件语句&#xff1b;本篇我们在上一篇的基础上介绍如何使用Mybatis提供的if,set标签动态生成更新语句。 如果您对if,where标签动态生成条件语句不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考…

前端实现动态路由(后端返回权限路由)

实现思路 1、前端定义静态路由&#xff08;login登录页这种不需要权限的默认路由&#xff09; 2、用户登陆时调接口获取用户信息&#xff0c;然后登录到首页 3、前后端定义好路由返回的格式 4、在路由导航钩子beforeEach中去调接口获取动态路由&#xff0c;递归处理该数据为前…

AtCoder Beginner Contest 315 Ex. Typical Convolution Problem(分治NTT/全在线卷积)

题目 给定长为n(n<2e5)的序列a&#xff0c;第i个数ai(0<ai<998244353) 求序列f&#xff0c;满足式子如下&#xff1a; 思路来源 jiangly代码/力扣群友tdzl2003/propane/自己的乱搞 题解 分治NTT&#xff0c;考虑[l,mid]对[mid1,r]的贡献&#xff0c; 但是&#x…

RT-Thread I/O设备模型(二)

访问I/O设备 应用程序通过I/O设备管理接口来访问硬件设备&#xff0c;当设备驱动程序实现后&#xff0c;应用程序就可以访问该硬件。I/O设备管理接口与I/O设备的操作方法映射关系如下&#xff1a; 查找设备 应用程序根据设备名称获取设备句柄&#xff0c;进而操作设备。 rt_…

MybatisPlus基本配置查询操作

无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作强大的 CRUD 操作&#xff1a;内置通用 Mapper、通用 Service&#…

手把手教你用Vite构建第一个Vue3项目

写在前面 在之前的文章中写过“如何创建第一个vue项目”&#xff0c;但那篇文章写的是创建vue2的 项目。 传送门如何创建第一个vue项目 打开Vue.js官网:https://cn.vuejs.org/&#xff0c;我们会发现Vue 2 将于 2023 年 12 月 31 日停止维护 虽然Vue2的项目还不少&#xff0…

day5 qt

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);timer_idthis->startTimer(100);//啓動一個定時器 每100ms發送一次信號ui->Edit1->setPlaceholderTex…

Leetcode:349. 两个数组的交集【题解超详细】

题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度&#xff1a;简单 题目链接&#xff1a;349.两个数组的交集 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,…

CentOS7上源码安装Redis6

CentOS7上源码安装Redis6 安装依赖开始安装下载安装包解压安装包编译源代码修改配置文件 启动并连接启动redis服务器本地连接远程连接 下篇预告 安装依赖 首先我们是源码包安装我们需要安装C语言编译器&#xff0c;顺便下载wget&#xff1a; yum install -y gcc wget开始安装…

Ab3d.PowerToys 11.0.8614 Crack

版本 11.0.8614 修补程序 使用 MouseCameraController 移动相机时防止旋转 FreeCamera。 版本 11.0.8585 重大更改&#xff1a;由于专利问题删除了 ViewCubeCameraController - 请联系支持人员以获取更多信息以及如果您想继续使用此控件。添加了 CameraNavigationCircles 控件…

第12节——生命周期

一、概念 生命周期指 React 组件从装载至卸载的全过程&#xff0c;这个过程内置多个函数供开发者在组件的不同阶段执行需要的逻辑。 状态组件主要通过 3 个生命周期阶段来管理&#xff0c;分别是 挂载阶段&#xff08;MOUNTING&#xff09;&#xff0c;更新阶段&#xff08;U…

AJAX学习笔记3练习

AJAX学习笔记2发送Post请求_biubiubiu0706的博客-CSDN博客 1.验证用户名是否可用 需求,用户输入用户名,失去焦点-->onblur失去焦点事件,发送AJAX POST请求,验证用户名是否可用 新建表 前端页面 WEB-INF下新建lib包引入依赖,要用JDBC 后端代码 package com.web;import jav…

ModaHub魔搭社区:自动化机器学习框架AutoML

AutoML 自动化机器学习AutoML 是机器学习中一个相对较新的领域,它主要将机器学习中所有耗时过程自动化,如数据预处理、最佳算法选择、超参数调整等,这样可节约大量时间在建立机器学习模型过程中。 自动机器学习 AutoML: 对于 ,令 表示特征向量, 表示对应的目标值。给定…

基于SpringCloudAlibaba实现的NacosConfig

概述 Nacos除了实现了服务的注册发现之外&#xff0c;还将配置中心功能整合在了一起。通过Nacos的配置管理功能&#xff0c;我们可以将整个架构体系内的所有配置都集中在Nacos中存储。这样做的好处主要有以下几点&#xff1a; 分离的多环境配置&#xff0c;可以更灵活的管理权…

基于Java+SpringBoot+Vue前后端分离大学生智能消费记账系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

基于Java+SpringBoot+Vue前后端分离农商对接系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…