散列类
散列(Hash)和数组一样,都是表示对象集合的对象,不同之处在于,数组使用索引来取得元素,而散列则是用键key,key可以是任何对象,而索引则不能,只能是整数。
散列的创建
1.使用 {}
{key=>value}
或
{key:value}
1 | hash1 = {"key1"=>"value1", "key2"=>"value2"} |
2.使用Hash.new
Hash.new()可带参数,当带参数的时候表示该参数为默认值,即当键不存在时,所得的值为该默认值;不带参数情况下,其默认值为nil
1 | hash1 = Hash.new |
散列的键可以是任意对象,一般推荐使用下列类型的对象来作为键:字符串(String), 数值(Numberic), 符号(Symbol), 日期(Date).
散列值的设置和获取
一般情况下,我们大多使用最普通的方法来给散列赋值或取值, 如果键不存在,则返回nil
1 | #common set and get |
Ruby还提供了store方法来存储值,使用fetch方法来获取值
1 | #store and fetch |
但fetch方法与[]不同之处在于,如果hash对象中不存在键时,使用此方法将会出错
1 | hash = Hash.new |
fetch方法同样可以返回一个默认值,当它指定第2个参数时或者带块时
1 | hash = Hash.new |
通过keys和values方法可以得到所有的键和值,而且to_a方法可以键值组合的数组。
1 | get all keys and values |
Ruby也支持了Hash对象的迭代遍历
1 | hash = {"a"=>"b", "c"=>"d"} |
散列的默认值
散列的默认值设置有三种方式
1.使用Hash.new带参数作为默认值
1 | hash = Hash.new("ruby") |
2.使用块指定默认值
1 | hash = Hash.new do |hash, key| |
3.使用fetch方法指定默认值
1 | hash = Hash.new do |hash, key| |
注:当Hash.new方法指定了默认值或块时,fetch方法的第二个参数指定的默认值的优先级是最高的,且看上例
散列其他方法
1.查看指定对象是否为散列的键
h.key?(key)
h.has_key?(key)
h.include?(key)
h.member?(key)
1 | hash = {"a" => "b", "c"=> "d"} |
2.查看指定对象是否为散列的值
h.value?(val)
h.has_value?(val)
1 | hash = {"a"=>"b", "c"=>"d"} |
3.获取散列的大小
hash.length
hash.size
1 | hash = {:a => "b", :c => "d"} |
4.判断散列是否为空
hash.empty?
1 | hash = {:a=>"b"} |
6.删除键值
h.delete(key)
h.delete_if{|key,val| …}
h.reject!{|key, val| …}
1 | hash = {:a => "b"} |
delete方法带块时,如果不存在指定的键, 则返回块中的结果。delete_if方法和**reject!**功能一样,区别在于如果不满足条件是,delete_if返回的是散列对象本身,而reject!则返回nil。
7.初始化散列
h.clear
用clear方法清空使用过的散列
1 | hash = {a:"b", c:"d"} |
关于散列的键
1 | hash = Hash.new |
注:在散列内部,程序会将散列获取值时指定的键,与将值保存到散列时指定的键做比较,判断两者是否一致。具体来说就是,如果两个键key1,key2,当key1.hash与key2.hash得到的整数值相同,并且key1.eql?(key2)为true时,就会认为这两个键是一致的。