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.sumc.maxc.mkString("/")
}

  • 可变数组
  val d=scala.collection.mutable.ArrayBuffer[Int]()d+=1d+=2d+=(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.toArrayfor(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 = 1scala> l.tail
res6: List[Int] = List(2, 3, 4, 5, 56)scala> l.tails
res7: Iterator[List[Int]] = non-empty iteratorscala> 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 ==){0else{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.mutableval 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 =0import scala.collection.mutableval 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.exampleobject 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.keysvar keyIterator = keys.iteratorwhile(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.exampleobject 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 = truedef 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 = falsedef get = x
}

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

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

相关文章

跟着我学Python进阶篇:02.面向对象(上)

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

免费运维工具测评——深入使用牧云主机管理助手

作为一名运维&#xff0c;宝塔&#xff0c;Nezha 监控面板&#xff0c;WinSCP&#xff0c;Termius 都用过了&#xff0c;谈一下自己的感受&#xff1a; 安装绑定 微信扫码可直接登录&#xff0c;主页简洁清晰&#xff0c;即使是个人体验版也没有任何广告。 只需要复制命令在服…

《More Effective C++》学习

条款1&#xff1a;仔细区别 pointers 和 references 引用应该被初始化&#xff0c;指针可以不被初始化。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。指针与引用的另一个重要的不同是指针可以被重新赋值…

【数据库原理】(11)SQL数据查询功能

基本格式 SELECT [ALL|DISTINCT]<目标列表达式>[,目标列表达式>]... FROM <表名或视图名>[,<表名或视图名>] ... [ WHERE <条件表达式>] [GROUP BY<列名 1>[HAVING <条件表达式>]] [ORDER BY <列名 2>[ASC DESC]];SELECT: 指定要…

《Linux C编程实战》笔记:线程私有数据

在多线程环境下&#xff0c;进程内的所有线程共享进程的数据空间&#xff0c;因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量&#xff0c;这种特殊的变量仅在某个线程内部有效。如常见的变量errno,它返回标准的出错代码。errno不应该是一个局部变量&…

冬日暖阳行走澳门探寻金沙度假区美食,游行全攻略

澳门金沙度假区是一个集度假、娱乐、购物、美食于一体的综合性旅游胜地。里面光酒店就有7家&#xff08;威尼斯人、巴黎人、四季、瑞吉、康莱德、假日、喜来登&#xff09;&#xff1b;大型购物中心4个&#xff08;四季名店、威尼斯人购物中心、巴黎人购物中心、金沙广场&#…

export default 和exprot

1.默认导入和默认导出 语法: export default {需要输出的内容} 接收: import 成员变量的名字 from 文件夹的路径 案例&#xff1a; a.mjs文件夹下默认导出 export default{a:10,b:20,show(){console.log(123);} } 在b.mjs文件中用成员变量进行接收 import AA from &q…

C语言之三子棋小游戏的应用

文章目录 前言一、前期准备模块化设计 二、框架搭建三、游戏实现打印棋盘代码优化玩家下棋电脑下棋判断输赢 四、结束 前言 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#…

构建安全可靠的系统:第十六章到第二十章

第四部分&#xff1a;维护系统 原文&#xff1a;Part IV. Maintaining Systems 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 准备应对不舒适情况的组织有更好的机会处理关键事件。 尽管不可能为可能扰乱您组织的每种情况制定计划&#xff0c;但作为综合灾难规划策略…

dubbo的springboot集成

1.什么是dubbo&#xff1f; Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo …

近两年最火的图像处理算法

近两年&#xff08;2022-2023年间&#xff09;在图像处理领域&#xff0c;有几个算法和技术特别受到关注。这些技术在提高图像质量、加速处理过程以及提升图像识别的准确性方面取得了显著进展。 以下是一些显著的例子&#xff1a; 生成对抗网络&#xff08;GANs&#xff09; GA…

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而实习管理…