hash方法匯總

來源:互聯網
上載者:User

一。給Hash添加預設值 :

h = {1,2,3,4}   #=> {1 => 2, 3 => 4}
h.default = 7
h[1]                #=>  2
h[3]                #=>  4
h[4]                #=>  7
h[5]                #=>  7

二。給Hash添加key-value對:

h = {}                     #=> {}
h.store("a",1)         #=> 1
h["a"]                     #=> 1
h.fetch("a")            #=> 1
h["b"] = 2               #=> 2
h["b"]                     #=> 2
p  h                        #=> {"a"=>1, "b"=>2}


store和[]= 方法是別名的關係,  fetch和[]方法是別名的關係。

三。清除Hash的key-value對:
h = {:a => 1, :b => 2}

刪除全部的k-v對,有兩種方法:
給hash賦空值
用clear方法 (這種方法更快一點)

shift方法隨機刪除k-v對。

h = {:a => 1, :b => 2, :c => 3}
h.shift             #=> [:a, 1]
h                     #=> {:b=>2, :c=>3}
a = h.shift       #=> [:c, 3]
a                     #=> [:c, 3]

delete, delete_if, reject,reject! 方法刪除指定的k-v對:

h = {:a => 1, :b => 2}
h.delete(:a)                     #=> 1
h                                     #=> {:b=>2}
h = {:a => 1, :b => 2}      #=> {:a=>1, :b=>2}
h.delete_if {|k,v| v != 3}   #=> {}
h                                     #=> {}
h = {:a => 1, :b => 2}      #=> {:a=>1, :b=>2}
h.delete_if {|k,v| v != 1}   #=> {:a=>1}
h = {:a => 1, :b => 2}      #=> {:a=>1, :b=>2}
h.reject {|k,v| v!=2}          #=> {:b=>2}
h                                     #=> {:a=>1, :b=>2}


reject方法相當於dup.delete_if{}

四。顛倒Hash的k-v對。

h = {:a => 1,:b => 1}        #=> {:a=>1, :b=>1}
x = h.invert                      #=> {1=>:b}


invert方法可以顛倒Hash的鍵-值,可是因為Hash鍵的唯一性,可能會發生上例那樣的資料丟失!

五。 Hash的迭代:
有each, each_key, each_value ,each_pair(each方法的別名)
不舉例了。

六。檢測Hash中的key,value:
   檢測是否有key:
     has_key?(include? 別名, 只能判斷key! ) ,key?, member? 
   檢測是否有value:
     has_value? value?

七。將散列轉換為數組:
 

h = {:a => 1, :b => 2}
   h.to_a         #=> [[:a, 1], [:b, 2]]   轉換為一個二維數組。
   h.keys         #=> [:a, :b]
   h.values      #=> [1,2]


   下面的方法有用點:

   h = {:a => 1, :b => '2', :c => 5}
   h.values_at(:a,:b)    #=> [1, “2”]    根據指定的key返回對應values的數組

八。根據條件選擇key-value對:
  

h.detect {|k,v| v == "2"}             #=> [:b, "2"]


   detect和find是別名關係,是Enumerable模組裡的方法,Hash類mixin這個模組,所以也可以用。select 方法,別名是find_all,可以返回多個匹配的k-v對:
 

h.select {|k,v| v.is_a?(Integer)}   #=> [[:a, 1], [:c, 5]]

九。 Hash的排序:
    可以直接用sort方法,不過會返回一個二維數組。
    值得注意的是,當Hash的key是Symbol類型的時候,sort方法會出錯。

十。 合并兩個Hash:
   使用merge方法,( merge!和update是別名關係 (thx Beck) )  。
 

h1 = {:a => 1, :b => 2}          #=> {:a=>1, :b=>2}
  h2 = {:b => 3, :d => 3}          #=> {:d=>3, :b=>3}
  h1.merge h2                         #=> {:a=>1, :d=>3, :b=>3}
  h2.merge h1                         #=> {:a=>1, :d=>3, :b=>2}


  注意看:b值的變化。 
 當然我們可以使用block來改變這一結局:

  h1.merge h2 do |k,old,new|
      old < new ? old : new
  end
 #=> {:a=>1, :d=>3, :b=>2}
h1.merge h2 do |k,old,new|
    p old
    p new
end
#=>2
#=>3


(當然我們可以使用rails裡active_support實現的revert_merge來實現上述效果)。

十一。 數群組轉換為Hash:
  當數組元素為偶數個數的時候:
  

arr = %w[a b c d]         #=> ["a", "b", "c", "d"]
    h = Hash[*arr]              #=> {"a"=>"b", "c"=>"d"}


   此時數組必須為偶數個元素。

十二。 當Hash的key是動態變化的時候:

x = [1,2]                  #=> [1, 2]
h = {x => 2}            #=> {[1, 2]=>2}
h[x]                         #=> 2
x[0] = 5                   #=> 5
h[x]                         #=> nil
h.rehash                 #=> {[5, 2]=>2}
h[x]                         #=> 2

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.