Date
May. 19th, 2024
 
2024年 4月 12日

Post: Ruby : 常用哈希方法

Ruby : 常用哈希方法

Published 12:08 Aug 02, 2014.

Created by @ezra. Categorized in #Programming, and tagged as #Ruby.

Source format: Markdown

Table of Content

一 给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}

三 清除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.mergeh2                        #=> {:a=>1, :d=>3, :b=>3}
h2.mergeh1                        #=> {:a=>1, :d=>3, :b=>2}
  • 注意看:b值的变化,当然我们可以使用block来改变这一结局:
h1.mergeh2 do |k,old,new|
      old< new ? old: new
  end
#=> {:a=>1, :d=>3, :b=>2}
h1.merge h2 do |k,old,new|
    pold
    p new
end
#=>2
#=>3

(当然我们可以使用rails里active_support实现的revert_merge来实现上述效果)

十一 数组转换为Hash:

当数组元素为偶数个数的时候:

arr= %w[a b cd]        #=> ["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
Pinned Message
HOTODOGO
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF