清單與雜湊
2015 年 12 月 3 日
現在許多程式設計環境中,使用清單和雜湊表複合體來表示資料結構已很常見。大多數主要語言現在都提供這些資料結構的標準版本,以及豐富的運算範圍,特別是 集合管道,用於處理這些資料結構。這些資料結構非常靈活,讓我們能夠以易於處理和操作的方式表示大多數層級形式。 [1]

此資料結構的精髓在於(通常)有兩種複合資料類型
- 雜湊表是鍵值資料結構,可以稱為關聯陣列、雜湊表、映射或字典。
- 清單是簡單的序列。它們與傳統陣列並不完全相同,因為它們會在您新增或移除元素時動態調整大小(但有些語言確實稱它們為陣列)。它們可以用整數鍵編制索引。
樹狀結構的葉節點可以是任何其他元素,通常是語言中的基本原語(例如整數和字串),但也可以是任何其他不能視為清單或雜湊的結構。
在大多數情況下,清單和雜湊有不同的資料類型,因為它們的存取運算不同。然而,正如任何 Lisp 使用者都可以告訴您的,將雜湊表示為鍵值對清單很容易。同樣地,您可以將具有數字索引的雜湊視為清單(這是 Lua 的表格所做的)。
清單和雜湊結構在預設情況下是無模式的,清單可以包含不同的元素,而雜湊可以包含任何鍵的組合。這讓資料結構非常靈活,但我們必須記住,當我們操作無模式資料結構時,我們 幾乎總是有一個隱含模式,因為我們預期某些資料會用某些鍵表示。
清單和雜湊結構的優點在於,您可以使用不了解實際存在鍵的通用運算來操作它。然後,您可以使用您想要操作的鍵來參數化這些運算。通用運算通常會排列成集合管道,提供許多導覽功能,讓您能夠從資料結構中提取您需要的部分,而無需操作個別部分。
雖然慣常的方式是對記錄使用彈性雜湊,但你可以採用一個使用已定義記錄結構(或物件)的結構,並在這些記錄結構提供反射操作時,以與雜湊相同的方式操作它。雖然此類結構會限制你可以放入的內容(這通常是件好事),但使用通用操作來操作它可能會非常有用。不過這確實需要語言環境提供將記錄查詢為雜湊的機制。
清單和雜湊結構可以輕鬆序列化,通常是序列化為文字形式。JSON 是此類資料結構特別有效的序列化形式,也是我的預設選擇。XML 通常用於序列化清單 'n' 雜湊結構,它可以勝任這項工作,但冗長且屬性和元素之間的區別對這些結構來說沒有意義(儘管它對標記文字很有意義)。
儘管清單 'n' 雜湊非常普遍,但有時我希望我正在使用深思熟慮的樹狀表示法。此類模型可以提供更豐富的導覽操作。在使用 Nokogiri 中序列化的 XML 結構時,我發現能夠使用 XPath 或 CSS 選擇器來導覽資料結構很方便。對於較大的文件,此類某種常見路徑規格很方便。另一個問題是,在樹狀結構中找到特定節點的父節點或祖先節點可能比應有的更為困難。豐富的清單和雜湊作為現代語言中的標準配備,是我自從開始使用 Fortran IV 進行程式設計以來,程式設計生涯中明確的進步之一,但沒有必要就此止步。
致謝
David Johnston、Marzieh Morovatpasand、Peter Gillard-Moss、Philip Duldig、Rebecca Parsons、Ryan Murray 和 Steven Lowe 在我們的內部郵件清單上討論了這篇文章。註解
1: 我覺得尷尬的是,對於這種資料結構沒有公認的跨語言術語。我可以用這種術語,因此我渴望創造一個 新詞