Scala - 快速学习05 - 数据结构
1- 数组(Array)
val myIntArr = new Array[Int](3) //> myIntArr : Array[Int] = Array(0, 0, 0)
myIntArr(0) = 111
myIntArr(1) = 222
myIntArr(2) = 333
for (i <- 0 to 2) println(myIntArr(i)) //> 111
//| 222
//| 333 val myStrArr = new Array[String](3) //> myStrArr : Array[String] = Array(null, null, null)
myStrArr(0) = "AAA"
myStrArr(1) = "BBB"
myStrArr(2) = "CCC"
for (i <- 0 to 2) println(myStrArr(i)) //> AAA
//| BBB
//| CCC val myIntArr2 = Array(123, 456, 789) //> myIntArr2 : Array[Int] = Array(123, 456, 789)
val myStrArr2 = Array("aaa", "bbb", "ccc") //> myStrArr2 : Array[String] = Array(aaa, bbb, ccc)
- 整型数组,每个数组元素初始化为0
- 字符串数组,每个数组元素初始化为null
2- 列表(List)
- 可以使用intList.head来获取列表的头部
- 可以使用intList.tail来获取列表的尾部
- 可以使用“::”操作符,可以在列表的头部增加新的元素,也可以构建列表
- 可以使用:::操作符对不同的列表进行连接得到新的列表
val intList = List(1, 2, 3) //> intList : List[Int] = List(1, 2, 3)
val intList2 = 4 :: 5 :: 6 :: Nil //> intList2 : List[Int] = List(4, 5, 6)
val initList3 = 0 :: intList //> initList3 : List[Int] = List(0, 1, 2, 3)
val initList4 = intList ::: intList2 //> initList4 : List[Int] = List(1, 2, 3, 4, 5, 6)
initList4.sum //> res0: Int = 21
3- 元组(Tuple)
val myTuple = ("AAA", 111, 'v') //> myTuple : (String, Int, Char) = (AAA,111,v)
println(myTuple._1) //> AAA
println(myTuple._2) //> 111
println(myTuple._3) //> v
4- 集(Set)
- 对不可变集进行操作,会产生一个新的集,原来的集并不会发生变化。
- 对可变集进行操作,改变的是该集本身。
var mySet = Set("AAA", "BBB") //> mySet : scala.collection.immutable.Set[String] = Set(AAA, BBB)
mySet += "CCC"
println(mySet.contains("CCC")) //> true
package testscala
import scala.collection.mutable.Set object TestScala {
def main(args: Array[String]) {
val myMutableSet = Set("AAA", "BBB")
myMutableSet += "ccc"
println(myMutableSet)
}
}
注意:虽然声明myMutableSet为val变量,但由于其是可变集,所以能够可以正确执行myMutableSet += "ccc",不会报错。
5- 映射(Map)
- 不可变映射,是无法更新映射中的元素的,也无法增加新的元素。
- 可变映射,可以更新和添加映射的元素,但在创建时需要引入scala.collection.mutable.Map包。
val test = Map("111" -> "AAA", 222 -> "BBB", "333" -> "CCC")
//> test : scala.collection.immutable.Map[Any,String] = Map(111 -> AAA, 222 -> B
//| BB, 333 -> CCC)
println(test("111")) //> AAA
println(test(222)) //> BBB
if (test.contains("333")) test("333") else 0 //> res0: Any = CCC
示例:可变映射
import scala.collection.mutable.Map
val test2 = Map(1 -> "a", 2 -> "b") //> test2 : scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)
test2(1) = "A"
test2(3) = "d"
test2 += (4 -> "d", 5 -> "e") //> res0: testrepl.test2.type = Map(2 -> b, 5 -> e, 4 -> d, 1 -> A, 3 -> d)
- 循环遍历映射的基本格式:for ((k,v) <- 映射) 语句块
- 可以同时遍历k和v,也可以只遍历映射中的k或者v
val test3 = Map("1" -> "AAA", "2" -> "BBB", "3" -> "CCC")
//> test3 : scala.collection.immutable.Map[String,String] = Map(1 -> AAA, 2 -> B
//| BB, 3 -> CCC)
for ((k, v) <- test3) printf("Key is : %s and Value is: %s\n", k, v)
//> Key is : 1 and Value is: AAA
//| Key is : 2 and Value is: BBB
//| Key is : 3 and Value is: CCC
for (k <- test3.keys) println(k) //> 1
//| 2
//| 3
for (v <- test3.values) println(v) //> AAA
//| BBB
//| CCC
for (x <- test3) println(x) //> (1,AAA)
//| (2,BBB)
//| (3,CCC)
6- 迭代器(Iterator)
- next可以返回迭代器的下一个元素
- hasNext用于检测是否还有下一个元素
val iter = Iterator("AAA", "BBB", "CCC") //> iter : Iterator[String] = non-empty iterator
while (iter.hasNext) {
println(iter.next())
} //> AAA
//| BBB
//| CCC
val iter2 = Iterator("111", "222", "333") //> iter2 : Iterator[String] = non-empty iterator
for (elem <- iter2) {
println(elem) //> 111
//| 222
//| 333
7 - 示例
def qSort(x: List[Int]): List[Int] = {
if (x.length <= 2) x
else qSort(x.filter(x.head > _)) ++
x.filter(x.head == _) ++
qSort(x.filter(x.head < _))
} //> qSort: (x: List[Int])List[Int]
qSort(List(6, 4, 5, 3, 1, 2, 9, 8, 0, 7)) //> res0: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 8, 7, 9)
排序示例-2:
def qSort(y: List[Int]): List[Int] =
if (y.length < 2) y
else qSort(y.filter(_ < y.head)) ++
y.filter(_ == y.head) ++
qSort(y.filter(_ > y.head)) //> qSort: (y: List[Int])List[Int] qSort(List(6, 4, 5, 3, 1, 2, 9, 8, 0, 7)) //> res0: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Scala - 快速学习05 - 数据结构的更多相关文章
- Scala - 快速学习08 - 函数式编程:高阶函数
函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...
- Scala - 快速学习02 - 搭建开发环境
1- 下载与安装 下载链接:http://www.scala-lang.org/download/ CMD To run Scala from the command-line, simply dow ...
- scala快速学习笔记(三):Collections,包
VI.Collections 1.Array 一些常用方法:println, map( _ * 2), filter(_ % 2 == 0), sum, reserve Array是不可变的, ...
- Scala - 快速学习09 - 函数式编程:一些操作
1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...
- Scala - 快速学习07 - 模式匹配
Scala中的模式匹配的功能可以应用到switch语句.类型检查.“解构”等多种场合. 简单匹配 Scala的模式匹配最常用于match语句中.Scala的match语句类似Java里的switch. ...
- Scala - 快速学习06 - 面向对象
1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...
- Scala - 快速学习04 - 求值策略
表达式求值策略(Evaluation Strategy) Scala中所有的运算都是基于表达式的. Call By Value - 对函数实参求值,且仅求值一次:函数调用之前对所有表达式进行求值 Ca ...
- Scala - 快速学习03 - 基础语法
1- 变量 变量 mutable variable 在程序运行过程中其值可能发生改变的量 关键词var定义变量,定义时直接进行求值 常量 immutable variable 在程序运行过程中其值不会 ...
- Scala - 快速学习01 - Scala简介
Scala简介 Scala(Scalable Language)是一门多范式(multi-paradigm)编程语言,Scala的设计吸收借鉴了许多种编程语言的思想,具备面向对象编程.函数式编程等特性 ...
随机推荐
- Maven中阿里云私服配置
在国内maven仓库连接速度太慢 ,虽然对于很多互联网企业和大中型软件公司,建个镜像是分分钟的事.但对于个人开发者确实是个问题.解决办法可以用阿里云的MAVEN私服.有两种方法: 1.在$MAVEN_ ...
- 微信支付自带的简易log
using System; using System.Collections.Generic; using System.Web; using System.IO; namespace WxPayAP ...
- 《修炼之道:.NET开发要点精讲》读书笔记(四)
委托的作用:1)它允许把方法作为参数,传递给其它的模块:2)它允许我们同时调用多个具有相同签名的方法:3)它允许我们异步调用任何方法. “方法签名”指方法的参数个数.参数类型以及返回值等,具有相同签名 ...
- spring jar包解读(转)
作者:http://www.cnblogs.com/leehongee/archive/2012/10/01/2709541.html spring.jar 是包含有完整发布模块的单个jar 包.但是 ...
- mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案
## 啊哈哈 这个简单,直接给出当前mac电脑登录账号密码即可,^_*,拿走不谢!!
- S系统的不好的实践
多个项目 多个分支放在一个SVN里边维护,导致多股力量并行开发时候的代码覆盖的风险可能性很大,, 好的实践是维护独立的SVN,彼此分离开来
- JAVA微信公众号通过openid发送模板消息~
1,问题产生 在微信公众号开发过程中,我们有时候做不同权限的时候,比如在注册的时候,需要审核,然后我们要想办法让对方知道审核的结果.这时候我们可以通过模板消息来通知. 2,第一步,首先在微信公众号上获 ...
- C++二分图匹配基础:zoj1002 FireNet 火力网
直接给出题目吧... 问题 D(1988): [高级算法]火力网 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给出一个N*N的网格,用'.'表示空地,用'X'表示墙.在网格上放碉堡,可 ...
- 虚拟机运行docker后映射端口到windows开发机
1.运行容器(以Oracle-xe-11g为例) 运行容器时先在虚拟机内映射端口 docker run -d -p 9090:8080 -p 1521:1521 wnameless/oracle-xe ...
- 将n个东西分成n1,n2,n3,n4,....nr 共 r组分给r个人有多少种分法。
(n!/(n1! *n2! *n3!..nr!) ) * r!/( 同数量组A的数量! 同数量组B的数量!....) 比方20个东西分成2,2,,2,2 3,3,3,3 8组分给8个人有多少种 ...