Scala Data Structure

来源:https://www.cnblogs.com/yuanzam/archive/2019/09/29/11605561.html
-Advertisement-
Play Games

Arrays 固定長度; 可變長度 , 初始化是不要使用 使用 訪問元素 使用 創建的預設為 的 hash map 可變的 Map 需要顯式指定 創建空的 Map 需指定類型 Map 是鍵值對的集合,鍵值對類型可不相同 等價於 ;創建的另一種寫法 訪問 //返回 Option // 返回實際值 mu ...


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

file

  • 集合性能對比
  • 多少集合通過 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 更高效


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明:最近特別忙,都沒有時間寫blog,好多遇到的問題都沒能記下來,下麵是PA1的報告主要記錄了nemu debuger一些功能的實現方式和實現中遇到的問題,代替一下blog ...
  • 1. 文件名含有特殊字元,直接使用 rm 可能刪除不了,可以使用如下方法: 1) 使用 ls -i 查處該文件的 inode 號,假設為123 2) 使用find命令刪除: rm `find ./ -inum 123` 2. 如果文件名是以 - 連字元開頭的,可以使用如下方法來刪除,如刪除 "-fi ...
  • 一般情況下,安裝好的Ubuntu系統中預設是只安裝了 ,此時只能通過此系統連接訪問其他系統,但不具有讓其他系統訪問的許可權。在終端查看ssh進程,輸入 ,如果有安裝 只會出現 ,不會出現 (因為博主已經安裝 ,所以會出現 )。 此時要想開放本機SSH服務以便其他系統登陸訪問,就必須安裝 ,安裝過程如下 ...
  • xfs分區格式調整分區大小 調整前備份: mkdir /tmp/home cp -r /home/* /tmp/home/ umount /home 卸載時報錯有占用 fuser -m -v -i -k /home 解除占用 umount /home lvremove /dev/cl/home lv ...
  • ls | xargs catls | xargs -I {} cat {} 大寫I,指定參數的替換符號為{} 自定義 ...
  • 1.vim /etc/my.cnf 2.service mysqld restart 3.進入 Mysql 4.進入從伺服器 5.vim /etc/my.cnf 6.進入從Mysql 配置主主,從第6步在主伺服器上重覆操作 ...
  • 1.tree 2.cal 3.passwd 4.ssh 5.scp 6.ifconfig 7.wget 8.mount 9.umount 10.fdisk 11.w 12.bc 13.mkfs 14.crontab 15.chmod 16.chown 17.chgrp 18.tar 19.vim 2 ...
  • 嵌入式和動態SQL規則:規定了SQL語句在高級語言程式設計中 使用的規範方法,以便適應較為複雜的應用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...