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 ...
随机推荐
- PHP json_decode 无法解析特殊问号字符
在通过别人接口请求信息的时候,偶尔会遇到由于部分字符,如以下情况,则通过json_decode是会返回null的 但是这种情况通常不是由于整体编码的问题,因为在解析的时候就是以utf-8的编码解析的 ...
- PHP curl_setopt函数用法介绍补充篇
1.curl数据采集系列之单页面采集函数get_html 单页面采集在数据采集过程中是最常用的一个功能 有时在服务器访问限制的情况下 只能使用这种采集方式 慢 但是可以简单的控制 所以写好一个常用的c ...
- 微信支付(公众号支付APIJS、app支付)服务端统一下单接口java版
一.微信公众号支付APIJS: 要完整的实现微信支付功能,需要前后端一起实现,还需要微信商户平台的配置.这里只是涉及服务端的代码. jar包:pom.xml <!-- ↓↓↓↓↓↓↓↓ 支付相关 ...
- hbase shell学习-2
一个学生成绩表的例子来演示hbase的用法. name grade course math english Tom 5 97 87 Jim 4 89 80 表的创建:语法:create '表名称',' ...
- TODO的用法
visual studio提供//TODO标记,不过不会在右边标记处明显标识,需要你选择菜单栏的视图进行查看.方法如下: 1.首先在你还未完成的地方打上TODO标记,以下方式均可: 1)//TODO: ...
- mysql的MyISAM 和 InnoDB 的区别?优化MYSQL数据库的方法?
MyISAM 和 InnoDB 的基本区别 1.InnoDB不支持FULLTEXT类型的索引. 2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from tabl ...
- mybatise 动态sql
1. <if><choose> 动态sql 相当 <if> Java if 满足多个条件 <choose> <when> java ...
- 超全面的JavaWeb笔记day12<Jsp&JavaBean&El表达式>
1.JSP三大指令 page include taglib 2.9个内置对象 out page pageContext request response session application exc ...
- HDOJ 4276 The Ghost Blows Light
题意 1. 给定一棵树, 树上节点有 value, 节点之间 travel 有 cost. 给定起始节点和最大 cost, 求解最大 value 思路 1. 寻找最短路径 a. 题目描述中有两句话, ...
- Array遍历的小技巧
如果在遍历中删除或增加了部分元素,就会导致遍历失败,因为对象数组的长度发生了变化,索引随之而变,遍历的结果不完整或者引发运行时错误.其实不需要任何复杂的判断,最简单的方法是:倒过来遍历,像这样: f ...