Scala入门到放弃—04—集合

文章目录

  • 集合
      • 数组
      • List
      • Set
      • Map
      • Tuple
      • 其他

集合

数组

  • 可变数组

package org.example
object ArrayApp extends App{
  //继承App后直接直接调用函数,不需要main
  //println("hello")
  val a = new Array[String](5)
  a(0)="hello"
  println(a(0))
  val b = Array("hello","world")
  val c = Array(1,2,3,4,5,67)
  c.sum
  c.max
  c.mkString("/")
}

  • 可变数组
  val d=scala.collection.mutable.ArrayBuffer[Int]()
  d+=1
  d+=2
  d+=(2,33,4)
  d++=Array(33,45,22)
  println(d+"-------------------")
  d.insert(0,999)
  d.remove(1,2)
  d.trimEnd(2)
  println(d+"-------------------")
  //转化成不可变的
  d.toString()
  d.toArray
  for(i<-0 until d.length){
    println(c(i))
  }
  for(i<-c){
     println(i)
  }
  // 逆序输出
  for(i<- (0 until c.length).reverse){
     println(i)
  }



hello
ArrayBuffer(1, 2, 2, 33, 4, 33, 45, 22)
-------------------
ArrayBuffer(999, 2, 33, 4, 33)
-------------------
1
2
3
4
5

List

list是不可变的,对list进行添加删除或者取值等操作均会返回一个新的list。

Scala数组是一个拥有相同类型的对象的可变序列。例如一个Array[String]只能包含字符串。虽然无法在数组实例化以后改变其长度,却可以改变它的元素值。因此,数组是可变的对象。

List有个方法叫:::,用于列表拼接
操作是::,读作cons。它在一个已有列表的最前面添加一个新的元素,并返回这个新的列表。
表示空列表的快捷方式是Nil,初始化一个新的列表的另一种方式是用::将元素串接起来,并将Nil作为最后一个元素

// 可以理解为一个C语言的\0
scala> Nil
res4: scala.collection.immutable.Nil.type = List()

scala> val l= List(1,2,3,4,5,56)
l: List[Int] = List(1, 2, 3, 4, 5, 56)

scala> l.head
head   headOption
// 一个list由一个head和一个tail组成 
scala> l.head
res5: Int = 1

scala> l.tail
res6: List[Int] = List(2, 3, 4, 5, 56)

scala> l.tails
res7: Iterator[List[Int]] = non-empty iterator

scala> val l1=List(2,3);
l1: List[Int] = List(2, 3)

scala> val l2=List(4,5,6)
l2: List[Int] = List(4, 5, 6)

scala> val l3=l1:::l2
l3: List[Int] = List(2, 3, 4, 5, 6)

scala> val l4=List(1,1)
l4: List[Int] = List(1, 1)

scala> val l5=1::l4
l5: List[Int] = List(1, 1, 1)

scala> val l6= 1:: 2 :: 3:: Nil
l6: List[Int] = List(1, 2, 3)

为什么不在列表末尾追加元素?
List类的确提供“追加”(append)操作,写作: +,但这个操作很少被使用,因为往列表(末尾)追加元素的操作所需要的时间随着列表的大小线性增加,而使用::在列表的前面添加元素只需要固定的时间(constant time)。
如果想通过追加元素的方式高效地构建列表,可以依次在头部添加完成后,再调用reverse
也可以用ListBuffer,这是个可变的列表,它支持追加操作,完成后调用toList即可。

Scala中List的常用方法和作用

方法名方法作用
List() 或者Nil空List
List(“one”,“two”,“three”)创建带有三个值的新List[String]
val number=“one”::“two”::“three”创建带有三个值的新List[String]
List(“a”,“b”):::List(“c”,“d”)叠加两个列表
number(2)返回在number列表上索引为2(基于0)的元素
number.count(v=>v.length==4)计算长度为4的String元素个数
number.drop(2)返回去掉前两个元素的number列表
number.dropRight(2)返回去掉后两个元素的number列表
number.exists(v=>v==“one”)判断是否有值为one的字符串的元素在number里
number.filter(v=>v.length==4)返回长度为4的元素一次组成的新列表
number.forall(s=>s.endwith(“l”))判断是否number列表里所有元素都以l结尾
number.foreach(v=>print(v))对number列表每个字符串执行print语句
number.foreach(print)同上,更简洁
number.head返回number列表的第一个元素
number.init返回number列表除最后一个以外其他元素组成的列表
number.isempty判断列表是否为空
number.last返回列表的最后一个元素
number.map(v=>v+“y”)返回列表里,每个string元素都加上y构成的列表
number.mkString(“,”)返回用列表的元素组成的字符串
numbe.remove(s=>s.length==4)返回除了number列表中长度为4的元素后的元素依次组成的新列表
number.reverse返回逆序组成的新列表
number.sort((s,t)=>s.charAT(0). toLowerCase<t.charAt(0).toLowderCase)返回列表元素按照第一个字符的字母小写排序之后依次组成的元素的列表
number.tail返回列表中除了第一个元素之外依次组成的新列表

def sum(nums : Int*):Int = {
	if(nums .length ==){
	  0
	else{
	  nums.head + sum ( nums.tail:_*)}
	}
}

:_* 可以将Seq转变一个可变参数

Set

set是一个非重复的集合,若有重复数据,则会自动去重。

scala> val set = Set(1,2,3,1,2,5)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)

Scala同时还提供了集(set)和映射(map)的可变和不可变的不同选


通过调用Set伴生对象的名为apply的工厂方法,实际上调用了scala.collection.immutable.Set的伴生对象的apply方法

要向不可变集添加新元素,可以对集调用+方法,传入这个新元素,+方法会创建并返回一个新的包含了新元素的不可变集。虽然可变集提供了一个实际的+=方法,但不可变集并不直接提供这个方法。


package com.hiszm.scala
object ClassAndObj {
  def  main(args:Array[String]):Unit={
    import scala.collection.mutable
    val s=mutable.Set("hi","szm")
    s+=".cn"
    println(s)
  }
}


Set(szm, hi, .cn)

在那一行,将s初始化成一个新的包含字符串"hi"和"szm"的新的可变集。只要你想,也完全可以不用s+= “.cn"这样的写法,而是写成s.+=(”.cn")。


package com.hiszm.scala
object SetApp {

  def  main(args:Array[String]):Unit={
    println("hello world")
    val arrs="hiszm.cn"
    var i =0
    import scala.collection.mutable
    val map=mutable.Map[Int,String]()
    map +=(1->"hi")
    map +=(2->"szm")
    map +=(3->".cn")
    println(map(2))
  }
}

通过->+=方法向映射添加键值对。即(1).->("szm");1的整数调用->方法。
如果你更倾向于使用不可变的映射,则不需要任何引入,因为默认的映射就是不可变的。由于没有显式引入,

Map

map是K-V键值对集合。

package org.example

object MapApp {

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

    val map = Map(
      "1" -> "hello" ,
      2 -> "world",
      3 -> "!!!!!"
    )
    println(map.mkString(","))

    println("-----------------------")
    for(x<-map){
      println(x._1+":"+x._2)
    }

    println("-----------------------")

    var keys = map.keys
    var keyIterator = keys.iterator
    while(keyIterator.hasNext) {
      val key = keyIterator.next()
      println(key + "\t" + map.get(key).get)
    }
  }
}
 1 -> hello,2 -> world,3 -> !!!!!
-----------------------
1:hello
2:world
3:!!!!!
-----------------------
1	hello
2	world
3	!!!!!


Tuple

与列表一样,与列表不同的是元组可以包含不同类型的元素。元组的值是通过将单个的值包含在圆括号中构成的。创建过程可加new关键词,也可不加。



package org.example

object TupleApp {

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

    var t=new Tuple3[Int,Int,String](1,99,"hello")
    println(t.toString())

    println("----------------")

    var t2=(9999,"hello")

    println(t2.toString())

    println(t2.swap.toString())


  }

}





(1,99,hello)
----------------
(9999,hello)
(hello,9999)


其他

    val map = Map(
      "1" -> "hello" ,
      2 -> "world",
      3 -> "!!!!!"
    )

    println(map.get(2))
    println(map.get(999))

Some(world)
None

option.scala


@SerialVersionUID(5066590221178148012L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
case object None extends Option[Nothing] {
  def isEmpty = true
  def get = throw new NoSuchElementException("None.get")
}


@SerialVersionUID(1234815782226070388L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
final case class Some[+A](x: A) extends Option[A] {
  def isEmpty = false
  def get = x
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux C/C++ 显示NIC流量统计信息

NIC流量统计信息是由操作系统维护的。当数据包通过NIC传输时&#xff0c;操作系统会更新相关的计数器。这些计数器记录了数据包的发送和接收数量、字节数等。通过读取这些计数器&#xff0c;我们可以获得关于网络流量的信息。 为什么需要这些信息? 可以使用这些信息来监控网络…

怎么投稿各大媒体网站?

怎么投稿各大媒体网站&#xff1f;这是很多写作者及自媒体从业者经常面临的问题。在信息爆炸的时代&#xff0c;如何将自己的文章推送到广大读者面前&#xff0c;成为了一个不可避免的挑战。本文将为大家介绍一种简单有效的投稿方法——媒介库发稿平台发稿&#xff0c;帮助大家…

不知道题目是啥

本题是学校的集训里的题&#xff0c;所有不知道题目名字是啥&#xff0c;直接看题目就好 解题思路&#xff1a;因为字符串只含有小写字母&#xff0c;所以可以创建两个数组分别来存s和t的每个字母出现次数&#xff0c;然后遍历数组&#xff0c;如果s字符串中的某个字母比t的小&…

Python GIL 一文全知道!

GIL 作为 Python 开发者心中永远的痛&#xff0c;在最近即将到来的更新中&#xff0c;终于要彻底解决了&#xff0c;整个 Python 社群都沸腾了 什么是GIL&#xff1f; GIL是英文学名global interpreter lock的缩写&#xff0c;中文翻译成全局解释器锁。GIL需要解决的是线程竞…

云卷云舒:kubernetes简介

Kubernetes是由google公司在2014年发布的一款开源的容器编排引擎&#xff0c;用于容器化应用程序的自动化部署、扩展与管理。它能够编排多种容器任务&#xff0c;涵盖虚拟机集群管理、负载均衡以及网络流量分配等等。2017年&#xff0c;aws、微软云、阿里云等等著名的云计算公司…

文献阅读1

A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images 会议/期刊&#xff1a;CVPR 2023&#xff1b;阿里达摩院&#xff1b;Biwen Lei 概述&#xff1a;这是一篇单张图片三维人脸重建的论文&#xff0c;这篇论文的…

26、web攻防——通用漏洞SQL注入SqlmapOracleMongodbDB2

文章目录 OracleMongoDBsqlmap SQL注入课程体系&#xff1b; 数据库注入&#xff1a;access、mysql、mssql、oracle、mongodb、postgresql等数据类型注入&#xff1a;数字型、字符型、搜索型、加密型&#xff08;base63 json&#xff09;等提交方式注入&#xff1a;get、post、…

ChatGPT提示词大赏:GPT Prompts Hub 2024年最新ChatGPT提示词项目

&#x1f31f; GPT Prompts Hub &#x1f31f; English | 简体中文 Security Prompts | GPTS Prompts 欢迎来到 “GPT Prompts Hub” 存储库&#xff01;&#x1f31f; 探索并分享高质量的 ChatGPT 提示词。培养创新性内容&#xff0c;提升对话体验&#xff0c;激发创造力。…

创建型模式 | 建造者模式

一、建造者模式 1、原理 建造者模式又叫生成器模式&#xff0c;是一种对象的构建模式。它可以将复杂对象的建造过程抽象出来&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&#xff09;的对象。创建者模式是一步一步创建一个复杂的对象&#xf…

在App Store Connect上编辑多个用户的访问权限

作为一名编程新手&#xff0c;在App Store Connect中管理用户权限可能初听起来有些复杂&#xff0c;但实际上它是一个相对直接的过程。这里是一个步骤清晰的指南来帮助您在App Store Connect上编辑多个用户的访问权限。 App Store Connect 简介 在开始之前&#xff0c;让我们先…

Linux权限2

相关命令 chown [用户名] [文件]​ 更改文件拥有者&#xff08;加sudo强制更改&#xff09; chown [拥有者]:[所属组] [文件] 更改文件拥有者和所属组&#xff08;root权限下&#xff09; chgrp [用户名] [文件] 更改文件所属组 文件类型 输入ls或ll显示的文件&#xff…

网络协议攻击与模拟_02ARP协议

一、arp协议简介 一个工作在二层的三层协议&#xff0c;事一个2.5层协议 ARP协议地址解析协议&#xff0c;将一个已知的Ip地址解析为MAC地址&#xff0c;从而进行二层数据交互 二、工作流程 1、两个阶段 ARP请求ARP响应 两台主机IP地址主机A和主机B&#xff0c;IP地址和MAC…

Ubuntu 实时查看显存调用命令 free 及命令详解与原理说明(全)

Ubuntu 实时查看显存调用命令 free 及详解 文章目录 Ubuntu 实时查看显存调用命令 free 及详解1 free 作用1.1 语法&#xff1a;1.2 单独显示例子1.3 组合显示例子 2 输出介绍3 原理解释3.1 buff / cache&#xff08;即 buffer / cache&#xff09;3.1.1 buffer 缓冲区3.1.2 ca…

Java生成包含ehcarts报表的PDF文件,亲测有效!!!

1.引入maven依赖 <dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>i…

QT第三天

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面如果账号和密码不匹配&#xff0…

基于SELinux三权分立配置方法

1.系统安装 系统安装完成后,系统当前的SELinux配置为: # cat /etc/selinux/config SELINUX=enforcing SELINUXTYPE=targeted 2.SELinux环境准备 # yum install setools policycoreutils.x86_64 selinux-policy-mls.noarch setroubleshoot.x86_64 setools-console -y 3.SELin…

Qt/QML编程学习之心得:hicar手机投屏到车机中控的实现(32)

hicar,是华为推出的一款手机APP,有百度地图、华为音乐,更多应用中还有很多对应手机上装在的其他APP,都可以在这个里面打开使用,对开车的司机非常友好。但它不仅仅是用在手机上,它还可以投屏到车机中控上,这是比较神奇的一点。 HiCar本质上是一套智能投屏系统,理论上所有…

【Unity】Timer计时器属性及使用

可以代替协程完成延时操作 可以不用Update进行计时 GitHub开源计时插件 网址&#xff1a;https://github.com/akbiggs/UnityTimer/tree/master 导入&#xff1a;URL&#xff1a;https://github.com/akbiggs/UnityTimer.git 基本功能&#xff1a; 创建计时器&#xff1a; Time…

计算机导论03-计算机组成

计算机系统结构 冯•诺依曼体系结构 冯•诺依曼体系结构的基本要点 冯•诺依曼思想即冯•诺依曼体系结构思想&#xff0c;其最基本的概念是存储程序概念&#xff0c;它奠定了现代计算机的结构基础。 功能部件: 计算机必须具备五大基本组成部件&#xff0c;包括&#xff1a;运…

15个等轴视图设计的电动车汽车无人机等PR剪辑素材视频制作元素

包含15个等轴视图、等距视角电动车、汽车、无人机、沙漏、飞机等PR剪辑素材视频制作元素mogrt动画模板。 特征&#xff1a; 等距设计&#xff1b; 可以更改颜色&#xff1b; 分辨率&#xff1a;全高清&#xff08;19201080&#xff09;&#xff1b; 持续时间&#xff1a;15秒&a…