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 ...
随机推荐
- centos查看启动时间
系统启动时间 who -b date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H ...
- u3d读取xml txt
u3d读取xml文件和u3d 读取txt外部文件 using UnityEngine;using System.Collections; using System.Xml;using System.X ...
- iOS private-api-checker私有API检测
转自: http://www.jianshu.com/p/07779e293ca7 注: '根目录' 指的是 private-api-checker 包的目录 iOS-private-api-che ...
- struts2的零配置
最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置.配置文件精简了,的确是简便了 ...
- jQuery checkbox选中问题之prop与attr注意点分析
$(function () { // 全选 $("#btnCheckAll").bind("click", function () { $(&q ...
- Ubuntu 安装 Oracle11gR2:'install' of makefile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk'
网上包括官方,就是教给你如何安装依赖包什么的:libstdc++5,但很麻烦:既要下载找相关的包,还不一定能安装的上. 其实,仅仅是为了安装,直接从二进制的deb包里,解压一个 “libstdc++. ...
- Unity3d + PureMVC框架搭建
0.流程:LoginView-SendNotification()---->LoginCommand--Execute()--->调用proxy中的函数操作模型数据--LoginProxy ...
- CSS Sprite的应用
什么是CSS Sprite ? 不知道您在浏览yahoo.com的网页中是否注意到,yahoo在页面制作上的技术和大多数网站不一样,他们把页面上的 ICON,栏目背景啊,图片按钮啊等都有会有规则的合并 ...
- css常用代码含义
1.font:12px Arial, Helvetica, sans-serif: 使用了缩写,完整的代码应该是:font-size:12px; font-family:Tahoma:说明字体为12像 ...
- kendo-ui的使用和开发自己的组件
摘要: 前面介绍了一款非常不错的前端框架kendo-ui,如果你想阅读,请点这里.通过使用它一段时间,感觉是非常好用.下面就介绍一下如何使用它和开发自己的组件 引入: 只需要引进下面三个文件即可 ke ...