主頁 > 資料庫 > Scala Data Structure

Scala Data Structure

2020-09-15 22:38:57 資料庫

Arrays

  • Array 固定長度;ArrayBuffer 可變長度
    • arr.toBuffer, buf.toArray
  • 初始化是不要使用 new
  • 使用 () 訪問元素
  • 使用 for (elem <- arr) 遍歷元素;倒序 arr.reverse
  • 使用 for (elem <- arr if ...) ... yield ... 轉換為新的陣列
    • 等價于 arr.filter(...).map(...) 或者更簡潔 arr filter { ... } map {...}
  • 與 Java 的陣列通用,如果是 ArrayBuffer, 可配合 scala.collection.JavaConversions 使用
  • 在做任何操作前都會轉換為 ArrayOps 物件
  • 構建多維陣列
    • val matrix = Array.ofDim[Double](3, 4) // 3 行 4 列

Maps & Tuples

  • 創建、查詢、遍歷 Map 的語法便捷
    • val scores = Map("a" -> 100, "b" -> 90, "c" -> 95) 創建的默認為 immutable 的 hash map
    • 可變的 Map 需要顯式指定 scala.collection.mutable.Map
    • 創建空的 Map 需指定型別 new scala.collection.mutable.HashMap[String, Int]
    • Map 是鍵值對的集合,鍵值對型別可不相同
      • "a" -> 100 等價于 ("a", 100);創建的另一種寫法 Map(("a", 100), ("b", 90), ("c", 95))
    • 訪問
      • scores("a") //回傳 Option
      • scores("d").getOrElse(0) // 回傳實際值
    • mutable 更新
      • 更新值 scores("a") = 80
      • 增加元素 scores += ("d" -> 70, "e" -> 50)
      • 洗掉元素 scores -= "a"
    • immutable 不可更新,修改時會產生新的 Map, 但公共部分的元素資料是共享的
      • 添加元素會產生新的 Map,scores + ("d" -> 70, "e" -> 50)
      • 洗掉元素產生新的 Map scores - "a"
    • 遍歷 for((k,v) <- map) ...
    • 排序 Map
      • 按照 key 排序存放 scala.collection.immutable.SortedMap("d" -> 1, "b" -> 2, "c" -> 3) // Map(b -> 2, c -> 3, d -> 1)
      • 按照插入順序排放 scala.collection.mutable.LinkedHashMap("d" -> 1, "b" -> 2, "c" -> 3) // Map(d -> 1, b -> 2, c -> 3)
  • 區分 mutable 和 immutable
  • 默認 hash map,也可使用 tree map
  • 與 Java 中的 Map 轉換方便 scala.collection.JavaConverters
    • 在很多時候需要使用 Java 的介面完成任務,但是處理結果時可轉換為 Scala 的資料介面來處理更方便,如檔案操作等
  • Tuples 在聚合操作時很有用
    • Map 中的鍵值對就是最簡單的元組形式 (k, v)
    • 型別不必一致 val a = (1, 3.14, "hello")
    • 下標訪問 a._1 // 1
    • 模式匹配訪問 val (first, second, _) = a
    • 用于回傳多個值
  • Zipping
    • 元組可用于系結多個值同時處理
    • zip 方法

Collections

  • 集合性能對比
  • 多少集合通過 scala.collection.JavaConverters 可與 Java 集合互相轉換
  • 集合區分 generic(scala.collection)、mutable(scala.collection.mutable) 和 immutable(scala.collection.immutable)
    • 如果未明確匯入包或使用包路徑,默認使用 immutable
  • 集合 traitclass 的伴生物件中,都有 apply 方法,可直接構造集合實體,如 Array(1,2,3)
  • Traversable 集合層級的頂部,只有 foreach 方法是抽象的,其他方法都可直接繼承使用
  • Iterable ,只有 iterator 方法是抽象的,其他方法都可直接繼承使用
    • Traversable 的區別在于,iterator 帶狀態(可選擇獲取下一個元素的時間,在獲取下一個元素之前會一直跟蹤集合中的位置)
    • Iterable 中的 foreach 通過 iterator 實作
  • Seq 有序序列,包含 length,有固定下標
    • IndexedSeq 快速隨機訪問,通過 Vector 實作
    • LinearSeq 高效的 head/ tail 操作,通過 ListBuffer 實作
  • Set 無序集合、無重復元素
    • 默認實作為 HashSet,即元素其實是按照對應的哈希值排序的
      • HashSet 中查找元素遠快于在 ArrayList 中查找
  • Map 鍵值對集合,scala.Predef 提供了隱式轉換,可直接使用 key -> value 表示 (key, value)
    • SortedMap 按 key 排序

Immutable

file

  • Vector 帶下標的集合,支持快速的隨機訪問,相當于 不可變的 ArrayBuffer

    • 通過高分叉因子的樹實作,每個節點包含 32 個元素或子節點
    • 在快速隨機選擇和快速隨機更新之間保持平衡
    • 彌補 List 在隨機訪問上的缺陷
  • Range 有序的整型集合,步長一致

    • 1 to 10 by 3 即生成 1 到 10 的序列,步長為 3
    • util 不包含上邊界,to 包含上邊界
    • 不存盤實際值,只保存 start, end, step 三個值
  • List 有限的不可變序列

    • 為空 Nil,或包含兩部分 head 元素和 tail (子 List)
    • :: 根據給定 headtail 構建新的 List
      • 右結合性,即從右側開始呼叫 1 :: 2 :: Nil 等價于 1 :: (2 :: Nil) // 結果 `List(1,2)
    • 根據 head, tail 的特性,可很容易進行遞回操作
      def multi(l: List[Int]): Int = l match {
        case Nil    => 1
        case h :: t => h * multi(t)
      }
      
    • 復雜度
      • 獲取 head, tail 只需要常數時間 O(1)
      • 在頭部添加元素也只需要常數時間 O(1);可使用 mutable.ListBuffer 可在頭部 或 尾部進行增/刪元素操作
      • 其他操作需要線性時間 O(N)
  • SortedSet 有序集合,按順序訪問元素,默認實作為紅黑樹

  • immutable.BitSet 非負整數集合,底層使用 Long 陣列存盤

    • 用較小的整型表示較大的整型,如 3,2,0 二進制表示為 1101,即十進制的 13
  • ListMap

    • 通過鍵值對的 LinkedList 來表示 Map
    • 多數情況下比標準的 Map 要慢,因此使用較少
      • 只有在獲取第一個元素較頻繁時才比較有優勢 (即 Listhead)
  • StreamList 類似,但其元素都是延遲計算

    • 長度無限制
    • 只有請求的元素會被計算
      • 可通過 force 來強制進行計算所有元素
    • 通過 #:: 構造,1 #:: 2 #:: 3 #:: Stream.empty 結果為 Stream(1, ?) 此處只列印了 head 1,而 tail 未列印,因為還未計算 tail
  • immutable.Stack LIFO 序列

    • push 入堆疊 , pop 出堆疊, top 查看堆疊頂元素
    • 很少使用,因為其操作都可以被 List 包括(push = ::, pop = tail, top = head)
  • immutable.Queue FIFO 序列

    • enqueue 入列,可使用集合做引數,一次性入列多個元素
    • dequeue 出列,結果包含兩部分 (element, rest)

Mutable

  • ArrayBuffer

    • 包含一個 arraysize (繼承自 ResizableArray)
    • 多數操作速度與 Array 相同
    • 可向尾部添加元素 (恒定分攤時間,對于更大的集合也可以高效的添加元素)
  • ListBuffer,類似于 ArrayBuffer 但是基于鏈表實作

  • LinkedList

    • 元素包含指向下一元素的鏈接
    • 空鏈表元素自己指向自己
  • LinkedHashSet 除了 Hash 的特點外,會記錄元素插入的順序

  • mutable.Queue

    • += 添加單個元素;++= 添加多個元素
    • dequeue 移除并回傳隊首元素
  • mutable.Stack 與不可變版本相同,除了會對原資料發生修改

  • mutable.BitSet 直接修改原資料,更新操作比 immutable.BitSet 更高效

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/50631.html

標籤:大數據

上一篇:淺談HDFS(三)之DataNote

下一篇:idea中flink啟動報錯org.apache.flink.api.common.ExecutionConfig$GlobalJobParameters

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more