關於雜湊
先來了解一下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.增...