Ruby中Hash雜湊結構的基本操作方法小結

2022-09-26 05:09:13 字數 4336 閱讀 1033

關於雜湊

先來了解一下hash的基本思路:

設要儲存物件的個數為num, 那麼我們就用len個記憶體單元來儲存它們(len>=num); 以每個物件ki的關鍵字為自變數,用乙個函式h(ki)來對映出ki的記憶體位址,也就是ki的下標,將ki物件的元素內容全部存入這個位址中就行了。這個就是hash的基本思路。

為什麼要用乙個函式來對映出它們的位址單元呢?

假設現在我要儲存4個元素 13 7 14 11

顯然,我們可以用陣列來存。也就是:a[1] = 13; a[2] = 7; a[3] = 14; a[4] = 11;

當然,我們也可以用hash來存。下面給出乙個簡單的hash儲存:

先來確定那個函式。我們就用h(ki) = ki%5;

對於第乙個元素 h(13) = 13%5 = 3; 也就是說13的下標為3;即hash[3] = 13;

對於第二個元素 h(7) = 7 % 5 = 2; 也就是說7的下標為2; 即hash[2] = 7;

同理,hash[4] = 14; hash[1] = 11;

現在我要你查詢11這個元素是否存在。你會怎麼做呢?當然,對於陣列來說,那是相當的簡單,乙個for迴圈就可以了。

也就是說我們要找4次。

下面我們來用hash找一下。

首先,我們將要找的元素11代入剛才的函式中來對映出它所在的位址單元。也就是h(11) = 11%5 = 1了。下面我們來比較一下hash[1]?=11, 這個問題就很簡單了。也就是說我們就找了1次。這個就是hash的妙處了,通過制定乙個規則(函式)來對映出它的位址,資料也就能通過這個規則去找到它的記憶體位址了。

ruby中的hash結構

1.建立雜湊:就像建立陣列一樣,我們可以通過hash類來建立乙個hash例項:

h1 = hash.new #預設值為nil

h2 = hash.new(「this is my first hash instance」) #預設值為」 this is my first hash instance」:

上面兩個例子都建立了乙個空的hash例項。乙個hash物件總是有乙個預設的值——因為如果在乙個hash物件裡沒有找到指定的索引(key),將會返回預設值。

建立了hash物件後,我們就可以像陣列那樣給他新增/刪除項了。唯一不同的是,在陣列中的索引只是能整數,而在hash中索引(key)可以是任何型別(any type of object)且唯一的資料:

h2["one"] = "北京"

h2["two"] = "上海"

h2["three"] = "深圳"

h2["four"] = "廣州"

note: 如果在給hash賦值時,使用的相同的key,那麼後面的值會覆蓋掉前面的值。另外,ruby還提供了一種方便的建立和初始化hash的方法,只需要在key後面加乙個=>符號並跟乙個值即可。每個key-value對用逗號隔開。然後整體用大括號括起來:

h2 =

2.通過索引訪問hash的值:

要想獲取某個值,可以用下面的方法:

puts h2[「one」] #=>」北京」

如果指定的key不存在,將返回預設的值(前面有提到過)。此外,我們還可以用default方法獲取預設值,用default+=方法設定預設值

put程式設計客棧s h1.default

h1.default += 「this is set value method」

3.複製hash:

和陣列一樣,我們可以把乙個hash變數分配給另乙個hash變數,它們都引用想同的hash,所以如果其中乙個的值變了,那麼另外乙個的值也會跟著變:

h3 = h2

h3[「one」] = 「西安」

puts h h2[「one」] #=>」西安」

有的時候我們不希望上面的情況發生,即:修改了其中乙個的值另乙個也跟著修改了,我們可以使用clone方法make a new 

copy

h4 = h2.clone

h4[「one」] = 「大連」

puts h2[「one」] #=>」西安」(i.e. 值沒有修改)

4.hash排序:

當我們需要對hash進行排序時,不能像陣列那樣簡單的使用sort方法,因為陣列中的資料型別都是一樣的(整型),hash中的資料型別可能並不完全一樣,如整數型別和字串型別就沒法一起排序,此時就需要我們進行處理,如下(如果hash中的資料型別全部相同可以不進行如下處理):

def sorted_hash(ahash)

return ahash.sort

endh1 =

h2 =

h3 =

h4 = h1.merge(h2) #合併hash

h5 = h1.merge(h3)

def sorted_hash(ahash)

return ahash.sort

endp(h4)

p(h4.sort)

p(h5)

p(sorted_hash(h5))

結果:[[1, "one"], [2, "two"], [3, "three"], [4, "four"], [5, "five"], [6, "six"]]

[[1, "one"], [2, "two"], [3, "three"], ["one", "a"], ["three", "c"], ["two", "b"]]

事實上hash的sort方法是把乙個hash物件轉換成以[key,value]為單個元素的乙個陣列,然後再用陣列的sort方法進行排序。

5.hash類常用方法:

方法說明

size()

返回hash對ejbhf象的長度

length()

返回hash物件的長度

include?(key)

判斷指定的hash物件是否包含指定的key

has_key?(key)

判斷指定的hash物件是否包含指定的key

delete(key)

刪除hash物件中指定key的對應元素

keys()

返回由hash物件中全部key組成的陣列

values()

返回由hash物件中全部value組成的陣列

e.g.

student =

p student.keys #=> ["name", "gender", "age"]

p student.values  #=> ["steve", "male", 22]

puts student.include?("age")   #=> true

puts student.size #=> 3

student.delete("gender")

puts student.has_key?("gender") #=>false

puts student.size #=>2

深度挖掘

1.把hash當作陣列來處理:

hash中的keys and values方法的返回值都是乙個陣列,所以我們可以使用陣列的方法來對它們操作:

h1 =

h2 =

p( h1.keys & h2.keys )

p( h1.values & h2.values )

p( h1.keys+h2.keys )

p( h1.values-h2.values )

p( (h1.keys << h2.keys) )

p( (h1.keys << h2.keys).flatten)

結果:[1, 3, 4]

["one", "two", "four"]

[1, 2, 3, 4, 5, 1, 3, 4]

["three"]

[1, 2, 3, 4, [5, 1, 3, 4]]

[1, 2, 3, 4, 5, 1, 3, 4]

2.追加和連續的區別:

+:給乙個陣列新增元素,建立乙個新的陣列

a=[1,2,3]

b=[4,5,6]

p(a+b)

p(a<

結果:[1, 2, 3, 4, 5, 6]

[1, 2, 3, [4, 5, 6]] #[1, 2, 3, [4, 5, 6]].flatten =>[1, 2, 3, 4, 5, 6]

本文標題: ruby中hash雜湊結構的基本操作方法小結

本文位址: /jiaoben/ruby/153835.html

Ruby 學習(七)雜湊型別Hash

新增新的健值對 獲取key對應的value 修改健值對 hash key value 刪除預設值 遍歷包含判斷 反轉key和value hash.invert 獲取拼接 內容替換 hash.replace other hash 例子 colors months hash.newmonths puts...

ruby中陣列及hash基礎

陣列及hash相關用法 數字和字串都可以作為 hash的鍵 將陣列轉化為 hash a 為物件陣列 首先定義乙個 hash h a.each compact 移出陣列內所有 nil的元素。形成不含 nil的陣列 join 將陣列以 內的格式輸出 map 將陣列中的元素再以陣列形式輸出 group b...

初識Redis的資料結構 雜湊(Hash)

redis中常用的五種資料型別 1 字串 string 2 字串列表 list 3 有序字串集合 sorted list 4 雜湊 hash 5 字串集合 set 一 儲存雜湊 hash 常用的命令 a.賦值hset hmset b,取值hget hmget hgetall c.刪除hdel d.增...