Scala数组和集合
一、scala数组
数组定义1: var arr = new Array[String](3)
String:存储的元素类型
3:存储3个元素
添加元素: arr(1) = "hello"
数组定义2: val arr1 = Array[Int](1,2,3,4,5,6)
改变内容:arr1(1) = 18
添加元素:arr1 += 22 长度不可以改变
二、数组方法
1、map(映射)
映射: 2 4 6
映射关系:f(x) = x*5
对应映射关系:10 20 30
例:
scala> var arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3) scala> arr.map((x: Int) => x * 10)
res12: Array[Int] = Array(10, 20, 30) scala> arr
res13: Array[Int] = Array(1, 2, 3) scala> res12
res14: Array[Int] = Array(10, 20, 30)
2、flatten(扁平化操作)
scala> var arr = Array("hello Beijing","hello China")
arr: Array[String] = Array(hello Beijing, hello China)
scala> arr.length
res6: Int = 2
scala> arr.map(_.split(" "))
res7: Array[Array[String]] = Array(Array(hello, Beijing), Array(hello, China))
scala> arr.map(_.split(" ")).flatten
res8: Array[String] = Array(hello, Beijing, hello, China)
3、flatMap(相当于先map操作再flatten)
scala> arr
res9: Array[String] = Array(hello Beijing, hello China) scala> arr.flatMap(_.split(" "))
res10: Array[String] = Array(hello, Beijing, hello, China)
4、foreach(遍历数组中的元素)
scala> res10.foreach(x => println(x))
hello
Beijing
hello
China scala>
5、GroupBy(分组)
scala> arr
res13: Array[String] = Array(hello Beijing, hello China) scala> arr.flatMap(_.split(" ")).groupBy(x => x)
res14: scala.collection.immutable.Map[String,Array[String]] = Map(Beijing -> Array(Beijing), China -> Array(China), hello -> Array(hello, hello)) //Scala简易WordCount
scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length))
res16: scala.collection.immutable.Map[String,Int] = Map(Beijing -> 1, China -> 1, hello -> 2)
6、sortBy(排序)
scala> arr
res13: Array[String] = Array(hello Beijing, hello China)
//正序
scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)).toList.sortBy(x => x._2)
res18: List[(String, Int)] = List((Beijing,1), (China,1), (hello,2))
//倒序
scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)).toList.sortBy(x => -x._2)
res19: List[(String, Int)] = List((hello,2), (Beijing,1), (China,1))
三、集合
scala集合有两种类型:可变mutable
不可变Immutable
val b = List(2,4,6)
不可变集合:内容不可变(数组内容可改变)
长度不可变
可变集合:
注意:需要导包
import scala.collection.mutable._
val buff = ArrayBuffer(2,3,4)
内容可变: buff(1) = 300
长度可变:buff += 200
例:
scala> val s = List(1,2,3)
s: List[Int] = List(1, 2, 3) scala> s(1) = 8
<console>:13: error: value update is not a member of List[Int]
s(1) = 8
^ scala> val b = List(2,3,4)
b: List[Int] = List(2, 3, 4) scala> b += 20
<console>:13: error: value += is not a member of List[Int]
b += 20
^ scala> import scala.collection.mutable._
import scala.collection.mutable._ scala> val buff = ArrayBuffer(2,3,4)
buff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 3, 4) scala> buff += 200
res23: buff.type = ArrayBuffer(2, 3, 4, 200) scala> buff(1) = 300 scala> buff
res25: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 300, 4, 200) scala> scala.collection.mutable.
AVLIterator History PriorityQueueProxy
AVLTree ImmutableMapAdaptor Publisher
AbstractBuffer ImmutableSetAdaptor Queue
AbstractIterable IndexedSeq QueueProxy
AbstractMap IndexedSeqLike ResizableArray
AbstractSeq IndexedSeqOptimized RevertibleHistory
AbstractSet IndexedSeqView Seq
AnyRefMap Iterable SeqLike
ArrayBuffer LazyBuilder Set
ArrayBuilder Leaf SetBuilder
ArrayLike LinearSeq SetLike
ArrayOps LinkedEntry SetProxy
ArraySeq LinkedHashMap SortedSet
ArrayStack LinkedHashSet Stack
BitSet LinkedList StackProxy
Buffer LinkedListLike StringBuilder
BufferLike ListBuffer Subscriber
BufferProxy ListMap SynchronizedBuffer
Builder LongMap SynchronizedMap
Cloneable Map SynchronizedPriorityQueue
DefaultEntry MapBuilder SynchronizedQueue
DefaultMapModel MapLike SynchronizedSet
DoubleLinkedList MapProxy SynchronizedStack
DoubleLinkedListLike MultiMap Traversable
FlatHashTable MutableList TreeSet
GrowingBuilder ObservableBuffer Undoable
HashEntry ObservableMap UnrolledBuffer
HashMap ObservableSet WeakHashMap
HashSet OpenHashMap WrappedArray
HashTable PriorityQueue WrappedArrayBuilder scala> val lb = scala.collection.mutable.ListBuffer(11,22,33)
lb: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 22, 33) scala> lb(1) = 334 scala> lb += 222
res27: lb.type = ListBuffer(11, 334, 33, 222) scala> lb
res28: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 334, 33, 222)
四、长度可变的数组
创建长度可变数组:
val ab = scala.collection.mutable.ArrayBuffer(2,3,4)
长度可变:
ab += 440
五、Seq序列
不可变的序列
在scala中列表要么为空(Nil表示空列表)
head元素上加上一个tail列表 head:取头元素
tail:取尾元素(除了头全是尾) 5::Nil 空列表的头加入一个元素
1::2::3::Nil 空列表前加入三个元素1,2,3 + 字符串的拼接
++ 两个集合相加
++: 合并集合
.+: 头部追加元素
:+ 尾部追加元素
::: 两个集合相加
count 统计个数
filter 过滤
sortBy 排序
sortWwith 排序
grouped 分组
fold 折叠
foldLeft 左折叠
foldRight 右折叠
reduce 聚合
aggregate 先局部聚合再全局聚合
zip 拉链
sum 求和
例:
scala> import scala.collection.immutable._
import scala.collection.immutable._ scala> Nil
res30: scala.collection.immutable.Nil.type = List() scala> val l = List(2,1,5,8,9)
l: List[Int] = List(2, 1, 5, 8, 9) scala> l.head
res31: Int = 2 scala> l.tail
res32: List[Int] = List(1, 5, 8, 9) scala> 5::Nil
res33: List[Int] = List(5) scala> val s = Nil
s: scala.collection.immutable.Nil.type = List() scala> 3::s
res34: List[Int] = List(3) scala> s
res35: scala.collection.immutable.Nil.type = List() scala> res34
res36: List[Int] = List(3) scala> 1::2::3::Nil
res37: List[Int] = List(1, 2, 3) scala> val ll = List(3,4,5)
ll: List[Int] = List(3, 4, 5) scala> ll + "a"
res38: String = List(3, 4, 5)a scala> ll
res39: List[Int] = List(3, 4, 5) scala> ll ++ List(6,7)
res40: List[Int] = List(3, 4, 5, 6, 7) scala> ll ++:List(6,7,8)
res41: List[Int] = List(3, 4, 5, 6, 7, 8) scala> ll
res42: List[Int] = List(3, 4, 5) scala> ll.+:(55)
res43: List[Int] = List(55, 3, 4, 5) scala> ll:+(66)
res44: List[Int] = List(3, 4, 5, 66) scala> ll
res45: List[Int] = List(3, 4, 5) scala> val lll = List(33,44)
lll: List[Int] = List(33, 44) scala> ll::lll
res46: List[Any] = List(List(3, 4, 5), 33, 44) scala> ll:::lll
res47: List[Int] = List(3, 4, 5, 33, 44) scala> ll
res48: List[Int] = List(3, 4, 5) scala> ll.count(x => x>4)
res49: Int = 1 scala> ll.count(x => x>=4)
res50: Int = 2 scala> ll.filter(x => x >+5)
<console>:19: error: value >+ is not a member of Int
ll.filter(x => x >+5)
^ scala> ll.filter(x => x >=5)
res52: List[Int] = List(5) scala> ll.filter(x => x >= 5)
res53: List[Int] = List(5) scala> val ls = List(6,2,1,3,8,7)
ls: List[Int] = List(6, 2, 1, 3, 8, 7) scala> ls.sortBy(x => x)
res54: List[Int] = List(1, 2, 3, 6, 7, 8) scala> ls.sortBy(x => -x)
res55: List[Int] = List(8, 7, 6, 3, 2, 1) scala> ls
res56: List[Int] = List(6, 2, 1, 3, 8, 7) scala> val sw = List(("h",2),("r",1),("m",4))
sw: List[(String, Int)] = List((h,2), (r,1), (m,4)) scala> sw.sortBy(x => x._2)
res57: List[(String, Int)] = List((r,1), (h,2), (m,4)) scala> sw.sortWith((x,y) => x._2 > y._2)
res58: List[(String, Int)] = List((m,4), (h,2), (r,1)) scala> val sw = List(("h",2),("r",2),("m",4))
sw: List[(String, Int)] = List((h,2), (r,2), (m,4)) scala> sw.groupd(2)
<console>:19: error: value groupd is not a member of List[(String, Int)]
sw.groupd(2)
^ scala> sw.grouped(2)
res60: Iterator[List[(String, Int)]] = non-empty iterator scala> sw.grouped(2).toList
res61: List[List[(String, Int)]] = List(List((h,2), (r,2)), List((m,4))) scala> val l2 = List(1,3,4)
l2: List[Int] = List(1, 3, 4) scala> l2.fold(0)((x,y) => x+y)
res62: Int = 8 scala> l2.fold(1)((x,y) => x+y)
res63: Int = 9 scala> l2.fold(2)((x,y) => x+y)
res64: Int = 10 scala> ls.fold(2)((x,y) => x-y)
res65: Int = -25 scala> ls
res66: List[Int] = List(6, 2, 1, 3, 8, 7) scala> l2.fold((x,y) => x-y)
<console>:19: error: missing parameter type
l2.fold((x,y) => x-y)
^
<console>:19: error: missing parameter type
l2.fold((x,y) => x-y)
^
<console>:19: error: missing argument list for method fold in trait TraversableOnce
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `fold _` or `fold(_)(_)` instead of `fold`.
l2.fold((x,y) => x-y)
^ scala> l2.fold(2)((x,y) => x-y)
res68: Int = -6 scala> l2.fold(2)(_+_)
res69: Int = 10 scala> l2.foldLeft(2)(_+_)
res70: Int = 10 scala> l2.foldRight(2)(_+_)
res71: Int = 10 scala> l2
res72: List[Int] = List(1, 3, 4) scala> l2.fold(0)(_ - _)
res73: Int = -8 scala> l2.foldRight(0)(_ - _)
res74: Int = 2 scala> l2.foldLeft(0)(_ - _)
res75: Int = -8 scala> l2
res76: List[Int] = List(1, 3, 4) scala> l2.reduce(_+_)
res77: Int = 8 scala> l2.reduce(_-_)
res78: Int = -6 scala> l2
res79: List[Int] = List(1, 3, 4) scala> l2.aggregate(0)(_+_,_+_)
res80: Int = 8 scala> val l3 = List(6,7,8)
l3: List[Int] = List(6, 7, 8) scala> l2.zip(l3)
res81: List[(Int, Int)] = List((1,6), (3,7), (4,8)) scala> val l3 = List(6,7,8,9)
l3: List[Int] = List(6, 7, 8, 9) scala> l2.zip(l3)
res82: List[(Int, Int)] = List((1,6), (3,7), (4,8)) scala> l2
res83: List[Int] = List(1, 3, 4) scala> l2.sum
res84: Int = 8
其中
scala> l2
res73: List[Int] = List(1, 3, 4) //相当于 1-(3-(4-0) 右折叠初始值在右
scala> l2.foldRight(0)(_ - _)
res74: Int = 2 //相当于 (0-1)-3)-4)
scala> l2.foldLeft(0)(_ - _)
res75: Int = -8
六、Set
无序的,不重复的集合
Set不可变的集合
val l5 = collection.mutable.HashSet(2,3,4)
HashSet可变的集合
remove 删除元素
-= 删除元素
++ 集合相加
++= 相加并赋值
例:
scala> val l4 = List(1,2,2,4)
l4: List[Int] = List(1, 2, 2, 4) scala> val s = Set(2,3,4)
s: scala.collection.immutable.Set[Int] = Set(2, 3, 4) scala> val s = Set(2,3,3,4)
s: scala.collection.immutable.Set[Int] = Set(2, 3, 4) scala> s += 5
<console>:19: error: value += is not a member of scala.collection.immutable.Set[Int]
s += 5
^ scala> collection.mutable.Hash
HashEntry HashMap HashSet scala> val l5 = collection.mutable.HashSet(2,3,4)
l5: scala.collection.mutable.HashSet[Int] = Set(2, 3, 4) scala> l5 += 6
res86: l5.type = Set(2, 6, 3, 4) scala> l5
res87: scala.collection.mutable.HashSet[Int] = Set(2, 6, 3, 4) scala> l5,remove(2)
<console>:1: error: ';' expected but ',' found.
l5,remove(2)
^ scala> l5.remove(2)
res88: Boolean = true scala> l5
res89: scala.collection.mutable.HashSet[Int] = Set(6, 3, 4) scala> l5 -= 3
res90: l5.type = Set(6, 4) scala> l4
res91: List[Int] = List(1, 2, 2, 4) scala> l5
res92: scala.collection.mutable.HashSet[Int] = Set(6, 4) scala> l4 ++ l5
res93: List[Int] = List(1, 2, 2, 4, 6, 4) scala> l5 ++= Set(2,7)
res94: l5.type = Set(2, 6, 7, 4)
七、Map
不可变Map:val m = Map[String,Int]("hello"->2,"world"->8)
可变Map:
getOrElse:如果有值返回值,没有返回默认值
例:
scala> val m = Map[String,Int]("hello"->2,"Beijing"->8)
m: scala.collection.immutable.Map[String,Int] = Map(hello -> 2, Beijing -> 8)
scala> m("hello")
res95: Int = 2
scala> m("hello") = 4
<console>:19: error: value update is not a member of scala.collection.immutable.Map[String,Int]
m("hello") = 4
^
scala> val m2 = collection.mutable.HashMap[String,Int]()
m2: scala.collection.mutable.HashMap[String,Int] = Map()
scala> m2.put("lisi",18)
res97: Option[Int] = None
scala> m2
res98: scala.collection.mutable.HashMap[String,Int] = Map(lisi -> 18)
scala> m2 += "weight" -> 120
res99: m2.type = Map(lisi -> 18, weight -> 120)
scala> m2.remove("lisi")
res100: Option[Int] = Some(18)
scala> m2
res101: scala.collection.mutable.HashMap[String,Int] = Map(weight -> 120)
scala> m2 -= "weight"
res102: m2.type = Map()
scala> m2
res103: scala.collection.mutable.HashMap[String,Int] = Map()
scala> m2 += "weight" -> 120
res104: m2.type = Map(weight -> 120)
scala> m2.get("weight")
res105: Option[Int] = Some(120)
scala> m2.getOrElse("zhangsan",18)
res106: Int = 18
scala> m2
res107: scala.collection.mutable.HashMap[String,Int] = Map(weight -> 120)
scala> m2 += "zhangsan" -> 28
res108: m2.type = Map(zhangsan -> 28, weight -> 120)
scala> m2.getOrElse("zhangsan",18)
res109: Int = 28
八、元组tuple
元组中可以是任意元素
val t = (2,true,"lisi",Unit)
取元素:t._1
对偶元组:有两个元素的元组
例:
scala> val t = (2,true,"lisi",Unit)
t: (Int, Boolean, String, Unit.type) = (2,true,lisi,object scala.Unit) scala> t
res110: (Int, Boolean, String, Unit.type) = (2,true,lisi,object scala.Unit) scala> t._1
res111: Int = 2 scala> t._3
res112: String = lisi scala> val t1 = ("lisi",18)
t1: (String, Int) = (lisi,18) scala> t1.swap
res113: (Int, String) = (18,lisi) scala> val t3 = Array(("lisi",18),("zhangsan",16))
t3: Array[(String, Int)] = Array((lisi,18), (zhangsan,16)) //求t3中的年龄的和
scala> t3.foldLeft(0)(_+_._2)
res114: Int = 34
Scala数组和集合的更多相关文章
- Scala数组| 集合
arrays :+ 5尾部 头部5 +: arrays TODO 声明不可变数组,不能删; 默认情况下,scala中集合的声明全都是不可变的 val arrays: Array[Int] = Ar ...
- Scala学习教程笔记一之基础语法,条件控制,循环控制,函数,数组,集合
前言:Scala的安装教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基础语法学习笔记: :声明val变量:可以使用val来声明变 ...
- 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))
1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...
- Programming In Scala笔记-第十七章、Scala中的集合类型
本章主要介绍Scala中的集合类型,主要包括:Array, ListBuffer, Arraybuffer, Set, Map和Tuple. 一.序列 序列类型的对象中包含多个按顺序排列好的元素,可以 ...
- scala的多种集合的使用(1)之集合层级结构与分类
一.在使用scala集合时有几个概念必须知道: 1.谓词是什么? 谓词就是一个方法,一个函数或者一个匿名函数,接受一个或多个函数,返回一个Boolean值. 例如:下面方法返回true或者false, ...
- Spark记录-Scala数组
Scala提供了一种数据结构叫作数组,数组是一种存储了相同类型元素的固定大小顺序集合.数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用. 可以声明一个数组变量,例如:numbers,使 ...
- 3、scala数组
一.Array .Array Buffer 1.Array 在Scala中,Array代表的含义与Java中类似,也是长度不可改变的数组. 此外,由于Scala与Java都是运行在JVM中,双方可以互 ...
- 4、scala数组
1.Array 2.ArrayBuffer 3.遍历Array和ArrayBuffer 4.数组常见操作 1. Array Scala中,array代表的含义与java类似,也是长度不可改变的数组. ...
- Scala 数组和List
Scala 数组和List: import scala.collection.mutable.ArrayBuffer import scala.collection.mutable.Buffer ob ...
随机推荐
- 基于swoole扩展实现真正的PHP数据库连接池
转自: http://rango.swoole.com/archives/265 PHP的数据库连接池一直以来都是一个难题,很多从PHP语言转向Java的项目,大多数原因都是因为Java有更好的连接 ...
- MathType公式保存后为什么字体会变化
在使用MathType数学公式编辑器的时候,很多的用户朋友是新手会遇到一些问题,比如,有时我们保存后却发现MathType公式字体变化了,原本的斜体变成了正体,面对这种问题我们该如何解决呢?下面就来给 ...
- 怎么输入MathType不等号
MathType是一款比较常用的数学公式编辑器,我们在使用这款软件的时候常常需要输入各种符号.有些新用户对这款软件不是很熟悉,对于一些符号不知道怎么输入,下面我们来给大家介绍介绍MathType不等号 ...
- php-fpm配置文件,指定session保存目录
cd /etc/php-fpm.d 目录下 cat www.conf文件 修改user ,group 指定session 保存路径 www.conf日志配置路径 php-fpm.conf
- ubuntu下Eclipse创建Django项目
(注:部分过程可能需要FQ) Eclipse版本:Mars.x 点击help->Eclipse Marketplace,搜索“PyDev”并下载安装. 然后选择window->prefer ...
- ubuntu 备忘
卷组扩容 Linux mint采用默认卷组的安装方式 sain@Linux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev .7G ...
- PostgreSQL数据库smallint、bigint转到Oracle,要用什么类型替代? 是number么,那长度分别是多少?
个人意见,仅供参考:smallint是有符号或无符号2字节的整数,范围是0-65,536,5位整数bigint是有符号或无符号8字节的整数,范围是0-18,446,744,073,709,551,61 ...
- 使用vim-pathogen 进行插件管理
使用vim的插件管理器 pathogen进行vim的插件管理. 1. pathogen 管理插件 pathogen让每个插件占有一个单独的目录,解决了文件分散的问题.安装完 pathogen之后,只需 ...
- c++11实现optional
optional< T> c++14中将包含一个std::optional类,optional< T>内部存储空间可能存储了T类型的值也可能没有存储T类型的值.当optiona ...
- 17,UC(06)
/* 达内学习 UC day06 2013-10-10 */ 回忆过去: 系统调用 - UNIX操作系统提供的一些列函数皆苦,用于访问内核空间,遵循posix规范 文件操作:open()\rea ...