散列

散列

關聯數組是這樣的數組,它的每個數據元素與一個鍵相對配對,該鍵用於識別數據元素。由於散列函式用來創建關聯數組中的指定元素,並在關聯數組中查找指定元素,因此關聯數組通常稱為散列。在某種意義上,數組元素與列表類似,而散列元素的存放與幾何類似,其元素之間沒有相對次序。在Ruby中,數組與散列之間的兩個最本質的區別是:數組使用數值下標來定位特定的元素,而散列使用字元串值(鍵)來定位元素;數組中的元素按下標排序,而散列中的元素則不是。散列的創建方法有兩種:new方法或將一個字面量賦值給一個變數。

基本介紹

  • 中文名:散列
  • 外文名:hash
  • 別名:哈希訊息摘要,關聯數組
  • 創建方法:new方法,將字面量賦值給變數
  • 實現工具:單向數學函式(也稱為散列算法)
  • 數組與散列:有兩個最本質的區別
定義,區別,創建方法,基本操作,

定義

通過將單向數學函式(有時稱為散列算法)套用到任意數量的數據所得到的固定大小的結果。假如輸入數據中發生更改,則訊息摘要的結果值也將更改。訊息摘要也被稱為散列。
關聯數組是這樣的數組,它的每個數據元素與一個鍵相對配對,該鍵用於識別數據元素。由於散列函式用來創建關聯數組中的指定元素,並在關聯數組中查找指定元素,因此關聯數組通常稱為散列。
存儲地址=Hash(關鍵碼) Hash-散列函式
所謂散列就是通過吧關鍵碼值映射到表中的一個位置來訪問記錄的過程。大多數散列方法根據地址計算需要的順序把記錄放到表中,這樣就不用根據值或者頻率的順序放置記錄了。
散列查找法(也稱雜湊查找法)是通過對記錄的關鍵字進行某個函式,直接得到記錄的存儲地址,不需要進行關鍵字的反覆比較。

區別

散列與數組的區別
在Ruby中,數組與散列之間的兩個最本質的區別是:
(1)數組使用數值下標來定位特定的元素,而散列使用字元串值(鍵)來定位元素;
(2)數組中的元素按下標排序,而散列中的元素則不是。
在某種意義上,數組元素與列表類似,而散列元素的存放與幾何類似,其元素之間沒有相對次序。散列元素在記憶體中的實際存放次序取決於散列函式對元素的插入與訪問方式。

創建方法

與數組一樣,也可以通過兩種方法創建散列。
new方法
需要注意的是,如果將不帶參數的new方法傳送到Hash類,則會創建一個用{}表示的空散列。例如:
>> my_hash = Hash.new
=> {}
將一個字面量賦值給一個變數
在該種方法中,字面量是一個散列字面量,其中每個元素通過由符號=>分隔開的鍵/值對來指定。散列字面量用大括弧定界。例如:
>>kids_ages = {"John" => 44,"Genny" => 42,"Jake" =>28,"Darcie" =>27}
=> { "Darcie" =>27,"John" => 44,"Genny" => 42,"Jake" =>28}
需要注意,Ruby返回的散列的順序與創建散列所用的散列字面量的順序是不同的。這是因為散列在記憶體中的實際順序是不可預知的(至少對用戶程式而言是這樣的)。

基本操作

訪問散列中的單個值元素
可通過將鍵用作下標來引用散列的方式訪問散列中的單個值元素。與訪問數組元素一樣,使用方括弧來指定這種下標操作。例如:
>> kids_ages["Genny"]
=> 42
向散列中添加新值
可通過將新元素的值賦給新元素的鍵引用散列添加新值,如下所示:
>> kids_ages["Aidan"] = 10;
=> {"Aidan"=>10,"Darcie" =>27,"John" => 44,"Genny" => 42,"Jake" =>28}
刪除散列元素
可用delete方法刪除散列元素,delete方法的參數是一個元素鍵。例如:
>> kids_ages.delete("Genny")
=>42
=>kids_ages
=>{"Aidan"=>10,"Darcie" =>27,"John" => 44,"Jake" =>28}
將散列設定為空散列
可採用兩種方法將散列設定為空散列:
(1)把一個空散列字面量賦給散列,例如:
>> hi_temps = {"mon" => 74,"tue" =>78}
=>{"mon" => 74,"tue" =>78}
>> hi_temp = { }
=> { }
(2)對散列使用clear方法,例如:
>> salaries = {"Fred" => 47400,"Mike" =>45250}
=>{"Fred" => 47400,"Mike" =>45250}
>> salaries.clear
=> { }
確定散列中是否具有某一特定建的元素
判定方法 has_key? 用於確定散列中是否具有某一特定建的元素。例如,假設仍採用前文中定義的kids_ages散列,則has_key?的用法如下所示:
>> kids_ages.has_key?("John")
=> true
>> kids_ages.has_key?("Henry")
=> false
提取散列的值到數組中
可分別使用方法keys和values將散列的鍵和值提取到數組中,如下所示:
>>kids_ages.keys
=> ["Aidan","Darcie","John","Jake"]
>> kids_ages.values
=> [10,27,44,28]

相關詞條

熱門詞條

聯絡我們