Scala第二天

数组 :new Array[Int](8)与Array[Int](8)的区别:第一种8个元素,第二个定义一个值为8的元素


scala> val arr1=new Array[Int](8)

arr1: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0)

scala> val arr2=Array[Int](8)---相当于val arr2=Array(8)该数组只有一个元素8,

arr2: Array[Int] = Array(8)

scala> arr1.length

res4: Int = 8

scala> arr2.length

res5: Int = 1

scala> arr1(0)

res0: Int = 0

scala> arr2(0)

res1: Int = 8

scala> arr2(3)

java.lang.ArrayIndexOutOfBoundsException: 3

... 32 elided 说明arr2只有一个元素

scala> arr1(0)=1

scala> arr1(0)

res3: Int = 1


变长数组:scala.collection.mutable.ArrayBuffer

1、定义变长数组arr4

scala> val arr4=ArrayBuffer[Int](8)

arr4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(8)

scala> arr4.length

res7: Int = 1

2、查看arr4中元素:只有一个元素8

scala> arr4

res9: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(8)

2、在数组的开始插入两个数1,2

scala> arr4.insert(0,1,2)

scala> arr4

res12: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 8)


倒序遍历数组元素:reverse函数

scala> for(i<-(0 until arr1.length).reverse) println{arr1(i)}

生成新的数组:yield关键字

scala> val arr=for(e<-arr1) yield e*3

arr: Array[Int] = Array(3, 0, 0, 0, 0, 0, 0, 0)

定长数组变为变长数组:toBuffer函数不会改变原数组类型

scala> arr1.toBuffer

res17: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 0, 0, 0, 0, 0, 0, 0

)

用这种方式接收toBuffer的结果

scala> val arr5=arr1.toBuffer

arr5: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 0, 0, 0, 0, 0, 0, 0)


数组常用算法

排序

scala> arr5.sorted

res18: scala.collection.mutable.Buffer[Int] = ArrayBuffer(0, 0, 0, 0, 0, 0, 0, 1

)

倒序排序

scala> arr5.sortWith(_>_)

res22: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 0, 0, 0, 0, 0, 0, 0

)

scala> arr5.sum

res19: Int = 1

scala> arr5.max

res20: Int = 1

scala> arr5.min

res21: Int = 0

sortBy算法:按照字典顺序还是数字顺序

数组中所有元素相加:reduce方法

scala> arr5.reduce(_+_):两个数相加结果赋给第一个占位符的数字,再与第二个占位符的数组相加,循环第一步。

res24: Int = 1

占位符:两个占位符的数字必须不同

map方法:以某种方式改变数组中每个元素的值

scala> arr5.map(_+3)

res25: scala.collection.mutable.Buffer[Int] = ArrayBuffer(4, 3, 3, 3, 3, 3, 3,

)


映射:

不可变映射

scala> val scores=Map("tom"->98,"jerry"->100)

scores: scala.collection.immutable.Map[String,Int] = Map(tom -> 98, jerry -> 100)

scala> val scores=Map(("tom",8),("jerry",100))

scores: scala.collection.immutable.Map[String,Int] = Map(tom -> 8, jerry -> 100)

scala> scores("tom")res26: Int = 8

scala> import scala.collection.mutable.map:12: error: object map is not a member of package scala.collection.mutable

可变映射

import scala.collection.mutable.map

scala> import scala.collection.mutable.Map

import scala.collection.mutable.Map

scala> val scores=Map("tom"->98,"jerry"->100)

scores: scala.collection.mutable.Map[String,Int] = Map(tom -> 98, jerry -> 100)

scala> scores("tom")=101

scala> scores("tom")

res28: Int = 101


小结:var val mutable immutable 定长数组 变长数组


定义可变映射hashmap

scala> val map1=new  scala.collection.mutable.HashMap[String,Int]()

map1: scala.collection.mutable.HashMap[String,Int] = Map()

向map集合添加元素的三种方式:

第一种方式:为键赋值的方式

scala> map1("liudehua")=90

scala> map1

res30: scala.collection.mutable.HashMap[String,Int] = Map(liudehua -> 90)

第二种方式:以键值对为一个整体加入

注意这种方式一个键值对要用括号括起来,否则会认为"liuruoying"是第一个键值对,而99是第二个键值对

scala> map1+=("liuruoying",99):15: error: type mismatch;

found  : String("liuruoying")

required: (String, Int)

map1+=("liuruoying",99)

正确加入键值对的方式

scala> map1+=(("liuruoying",99))

res33: map1.type = Map(liudehua -> 90, liuruoying -> 99)

第三种方式:put  注意这种方式键值对不加括号

scala> map1.put("zhagngwuji",100)

res34: Option[Int] = None

加括号之后报错:

scala> map1.put(("zhagngwuji",100)):15: error: not enough arguments for method put: (key: String, value: Int)Option[Int].Unspecified value parameter value.

将键值对从hashmap中移除:

当前hashmap中键值对

scala> map1

res37: scala.collection.mutable.HashMap[String,Int] = Map(liudehua -> 90, zhagngwuji -> 100, liuruoying -> 99)

测试1:键值对:错误:要求remove中参数必须是string类型,即key的类型

scala> map1.remove(("zhagngwuji",100))

error: type mismatch; found  : (String, Int)

required: String      

正确的方式是传递一个key进去:

scala> map1.remove("zhagngwuji")

res40: Option[Int] = Some(100)

scala> map1

res41: scala.collection.mutable.HashMap[String,Int] = Map(liudehua -> 90, liuruo

ying -> 99)


元组:不同类型的值的聚集==tuple(storm(分布式流计算框架)中的地铁5号线)

定义一个元祖

scala> val array=Array((1,"liudehua",20,"F"),(2,"liuruoying"))

array: Array[Product with Serializable] = Array((1,liudehua,20,F), (2,liuruoying

))

元祖转换为映射

错误方式:

scala> array.toMap:15: error: Cannot prove that Product with Serializable <:< (T, U).

array.toMap

正确方式:

scala> val array2=Array((1,"liudehua"),(2,"liuruoying"))

array2: Array[(Int, String)] = Array((1,liudehua), (2,liuruoying))

scala> array2.toMap

res43: scala.collection.immutable.Map[Int,String] = Map(1 -> liudehua, 2 -> liur

uoying)

zip与toMap结合:拉链操作与映射操作

scala> val names=Array("liudehua","liuruoying")

names: Array[String] = Array(liudehua, liuruoying)

scala> val scores=Array(99,98,90)

scores: Array[Int] = Array(99, 98, 90)

scala> names.zip(scores)

res44: Array[(String, Int)] = Array((liudehua,99), (liuruoying,98))

scala> res44.toMap

res45: scala.collection.immutable.Map[String,Int] = Map(liudehua -> 99, liuruoyi

ng -> 98)


序列:不可变序列

scala> val list=List(1,2,3)

list: List[Int] = List(1, 2, 3)

scala> list

res46: List[Int] = List(1, 2, 3)

scala> val list2=List(4,5,6)

list2: List[Int] = List(4, 5, 6)

两个集合合并

scala> list++list2

res48: List[Int] = List(1, 2, 3, 4, 5, 6)

可变序列:

import scala.collection.mutable.ListBuffer

scala> val list0=ListBuffer[Int](1,2,3)

list0: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3)

list是不可变集合,不可在操作符前

scala> list++=list0:17: error: value ++= is not a member of List[Int]

list++=list0

^

而list0才是可变,下面这种方式正确:

scala> list0++=list

res50: list0.type = ListBuffer(1, 2, 3, 1, 2, 3)

list的一些方法:头、尾(尾巴很长)、求和、reduce、map等等

scala> list.head

res51: Int = 1

scala> list.tail

res52: List[Int] = List(2, 3)

scala> list.sum

res53: Int = 6

scala> list.reduce(_+_)

res54: Int = 6


综合例子:wordcount

wordcount例子

对比第一天的Wordcount例子

array.flatMap((x:String)=>x.split(" ")).map(x=>(x,1)).reduceByKey((_+_)).collect


可变HashSet的使用:

scala> import scala.collection.mutable.HashSet

import scala.collection.mutable.HashSet

scala> val set2=HashSet(1,2,3)

set2: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3)

scala> set2++=HashSet(3,4,5)

res63: set2.type = Set(1, 5, 2, 3, 4)


io.Source读取文件

scala> import scala.io.Source

import scala.io.Source

scala> lazy val file=Source.fromFile("f:/serenity/scala/word.txt")

file: scala.io.BufferedSource =<lazy>

遍历文件中每一行

scala> for(line<-file.getLines)println(line)

由于file被lazy修饰,因此在调用getLines方法时才去初始化file ,此时报错找不到文件。

java.io.FileNotFoundException: f:\serenity\scala\word.txt (系统找不到指定的文件

。)


总结:以上是函数式编程语法的学习(高阶函数),算子:flatMap map reduceByKey collect

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Scala的集合类可以从三个维度进行切分: 可变与不可变集合(Immutable and mutable coll...
    时待吾阅读 5,798评论 0 4
  • Array //声明变量arr为Array整数类型的数组,包含5个元素。 scala>valarr=newArra...
    flyskyzyl阅读 5,648评论 0 4
  • PARAMETERIZE ARRAYS WITH TYPES In Scala, you can instanti...
    RxCode阅读 772评论 0 0
  • 数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示Java中的数组形式 T[]。 v...
    时待吾阅读 938评论 0 0
  • scala文档 包含内容 1基础 2控制结构和函数 3数组相关操作 4映射和元组 5类 6对象 7.包和引入(x)...
    zlcook阅读 996评论 0 3