Scala的小总结和计算信息熵

在工作中,我通常使用pyspark和Java调用spark进行数据处理。考虑到python的性能和java代码的繁复性,以及公司特有的jar包没有python版本,便开始使用scala进行大数据处理。下面是我在使用过程中的一些基础属性总结,最后,综合所有小知识点,给出了一个信息熵的scala版本计算函数。

Array、ArrayBuffer与List

Array数组
提供下标高效访问(获取或更新)指定位置的元素值。

  • 内容:不可变
  • 大小:不可变

ArrayBuffer可变数组
跟Array很像,除了可以额外地从序列头部或尾部添加或移除元素。所有的Array操作在ArrayBuffer都可用。不过由于实现的包装,会稍慢一些。

  • 内容:可变
  • 大小:可变
    新建一个可变数据
import scala.collection.mutable.ArrayBuffer
val locations = ArrayBuffer[String]()

使用toList、toArray相互转换:

scala> Array(1,2,3).toList
res14: List[Int] = List(1, 2, 3)
scala> List(1,2,3).toArray
res15: Array[Int] = Array(1, 2, 3)​

List
List元素不能通过赋值改变。为后进先出做了优化,支持用::在模式匹配中取出head和tail,即支持在头部快速添加和移除条目。但是不提供快速按下标访问的功能,这个功能需要线性遍历列。

  • 内容:不可变
  • 大小:不可变

代码示例:

val list = List(1, 2, 3, "beijing")
// 在列表的最后追加
val newList = list :+ 6
// 在列表的头追加
val newList02 = 6 +: list

val list = List(1,2,3)
// :: 用于的是向队列的头部追加数据,产生新的列表, x::list,x就会添加到list的头部
println(4 :: list) 
//输出: List(4, 1, 2, 3)

// .:: 这个是list的一个方法;作用和上面的一样,把元素添加到头部位置; list.::(x);
println( list.:: (5))
//输出: List(5, 1, 2, 3)

// :+ 用于在list尾部追加元素; list :+ x;
println(list :+ 6) 
//输出: List(1, 2, 3, 6)

// +: 用于在list的头部添加元素;
val list2 = "A"+:"B"+:Nil 
//Nil Nil是一个空的List,定义为List[Nothing]
println(list2)
//输出: List(A, B)

// ::: 用于连接两个List类型的集合 list ::: list2
println(list ::: list2) 
//输出: List(1, 2, 3, A, B)

// ++ 用于连接两个集合,list ++ list2
println(list ++ list2) 
//输出: List(1, 2, 3, A, B)

​tuple元组

当你定义一个函数,想返回不同类型值时,可以使用元组。
val t = (1,23,"we are")
通过下列方式提取元组的值:
val (data_1,data_2,data_3) = t

map字典

新建一个可变字典

import scala.collection.mutable
val labelCounts: mutable.Map[String, Int] = mutable.Map()

遍历字典的几种方式

// 遍历 map 的 key 和 value
for ((key, value) <- b) {
 println("key is" + key + " ,value is" + value)
}

//遍历 map 的 key 和 value
for (x <- map1){
 println(x._1 + "->" + x._2)
}

// 遍历 map 的 key
for (ele <- b.keySet) {
 println("key is " + ele + " ,value is" + b.getOrElse(ele, 0))
}

// 遍历 map 的 value
for (ele <- b.values) {
 println("value is " + ele)
}

// 生成新 map ,反转 key 和 value
for ((key, value) <- b) {
 yield (value, key)
}

计算信息熵,传入一个数组和数组长度即可计算。

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

推荐阅读更多精彩内容

  • 数组 :new Array[Int](8)与Array[Int](8)的区别:第一种8个元素,第二个定义一个值为8...
    夙夜M阅读 1,750评论 1 2
  • Scala的集合类可以从三个维度进行切分: 可变与不可变集合(Immutable and mutable coll...
    时待吾阅读 5,798评论 0 4
  • Array //声明变量arr为Array整数类型的数组,包含5个元素。 scala>valarr=newArra...
    flyskyzyl阅读 5,648评论 0 4
  • 可变和不可变集合 Scala中的集合可分为可变集合和不可变集合。可变集合可以当场被更新,不可变集合本身是不可变的。...
    liqing151阅读 200评论 0 0
  • 3.数组、映射、元组、集合 3.1数组 3.1.1定长数组和变长数组 object ArrayDemo {def ...
    G__yuan阅读 507评论 0 2