哈希表的建立:
Hash.new
Hash.new default #这是hash表为空,但是如果使用某个键访问hash表将得到默认值
Hash[ key, value, key, value....]
Hash[key=>value, key=>value....]
{key => value, key => value.....}
访问哈希表
hash[key]
hash.keys
hash.values
hash.values_at key1,key2.... #得到一个value数组 #注意是values
hash.index value
hash.select { |key, value| .....} #得到一个满足条件的key value对数组
hash.each {|key, value| ....}
hash.each_key{ |key|....}
hash.each_value{ |value|....}
哈希表的判定
hash.empty?
hash.has_key?
hash.has_value?
哈希表的修改
hash[key] = value #如果key不存在,则是新增。否则是修改
hash.store("a",1) #=> 1
hash.fetch("a") #=> 1
hash.merge(!) hash1 [block]#hash1会覆盖hash中具有同样key的value block可选,参数为|key,
old_value, new_value|
hash.delete key [block]#会改变hash
hash.delete_if block #block = { |key, value| 某个条件,条件满足则执行delete}
hash.reject (!){ |key, value| condition} #reject!与delete_if相同
hash.clear
hash.replace( new_hash ) #会改变原hash表,这里括号不可少
哈希表的转换
hash.to_a #将hash转换为数组,其中每个元素是一个key, value组成的数组
hash.to_s
hash.to_hash #恩,遗留问题........对于ruby的对象还是不太明白。这个东西使用来创造一个对象的别名。但是赋
值也可以.....Ruby中好像一切相等的东西都有相同的object_id。。。。。
数组转换为Hash
当数组元素为偶数个数的时候:
arr = %w[a b c d] #=> ["a", "b", "c", "d"]
h = Hash[*arr] #=> {"a"=>"b", "c"=>"d"}
Hash的其他操作
排序
可以直接用sort方法,不过会返回一个二维数组。
值得注意的是,当Hash的key是Symbol类型的时候,sort方法会出错。
根据条件选择
h.detect {|k,v| v == "2"} #=> [:b, "2"]
detect和find是别名关系,是Enumerable模块里的方法,Hash类mixin这个模块,所以也可以用。select 方法,
别名是find_all,可以返回多个匹配的k-v对
翻转键值对
h = {:a => 1,:b => 1} #=> {:a=>1, :b=>1}
x = h.invert #=> {1=>:b}