基本概念
哈希(Hash)是类似 “key” => “value” 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。
Hash 的索引(或者叫”键”)几乎可以是任何对象。
Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。
创建哈希
与数组一样,有各种不同的方式来创建哈希。
1.可以通过 new 类方法创建一个空的哈希:
h1 = Hash.new
h1["one"] = "碧游宫"
h1["two"] = "玉虚宫"
h1 = {
"two" => "兜率宫"
"three" => 灌江口"
}
如果在给Hash赋值时,使用的相同的key,那么后面的值会覆盖掉前面的值。另外,Ruby还提供了一种方便的创建和初始化Hash的方法,只需要在key后面加一个=>符号并跟一个值即可。每个key-value对用逗号隔开。然后整体用大括号括起来:
2.可以创建带有默认值的hash,不带默认值的hash是nil
months = Hash.new("month")
#or
months = Hash.new"month"
访问带有默认值的hash中任意键,如果键or值不存在, 那么返回默认值
实例:
#!/usr/bin/ruby
H = Hash["a"=>100,"b"=>200]
puts "#{H['a']}"
puts H["b"]
结果:
100
200
可以使用任何Ruby对象作为键或值,设置可以使用数组,如下例
[1,"jan"] => "January"
哈希内置方法
1.获取默认值或设置默认值
puts h1.default
h1.default += "This is default value"
2.复制hash
和数组一样,我们可以把一个Hash变量分配给另一个hash变量,它们都引用想同的Hash,所以如果其中一个的值变了,那么另外一个的值也会跟着变:
h3 = h2
h3["one"] = "玉虚宫"
puts h2["one"] #=>"玉虚宫"
有的时候我们不希望上面的情况发生,即:修改了其中一个的值另一个也跟着修改了,我们可以使用clone方法make a new copy
h4 = h2
h4["one"] = "碧游宫"
puts h2["one"] #=>"玉虚宫"
3.Hash排序
如果需要比较这个Hash表中年龄的大小
people = {
:me => 23,
:bro => 18,
:sis => 25
}
直接用sort方法
people.sort
#=> [[:brother, 18], [:me, 23], [:sister, 25]]
sort对字符串也能处理
["3","1","2"].sort
#=> ["1", "2", "3"]
但是,如果我们想指定Hash表中比较的元素,就要用到sort_by方法,比如要处理下面的复杂点的内嵌的hash表:
people = {
:me => { :name => "hen", :age => 23 },
:brother => { :name => "abb", :age => 18 },
:sister => { :name => "ndd", :age => 25 }
}
可以这样处理
people.sort_by do |key,value|
value[:age]
end
#=> [[:brother, {:name=>"abb", :age=>18}], [:me, {:name=>"hen", :age=>23}], [:sister, {:name=>"ndd", :age=>25}]]
sort_by提取出了两个元素k和v,k是第一层hash表的键(symbol对象),而v是第一层hash表的值(内嵌hash对象),这样v[:age]就代表着年龄值(Fixnum),块内需指明了要比较的对象,在这里是指的是Fixnum对象,还有其他String也可以,所以sort_by能正常工作。
people = {
:me => 23,
:brother => 18,
:sister => 25
}
people.sort_by do |v|
v[1]
end
4.常用方法
方法 | 说明 |
---|---|
size() | 返回Hash对象的长度 |
length() | 返回Hash对象的长度 |
include?(key) | 判断指定的Hash对象是否包含指定的key |
has_key?(key) | 判断指定的Hash对象是否包含指定的key |
delete(key) | 删除Hash对象中指定key的对应元素 |
keys() | 返回由Hash对象中全部key组成的数组 |
values() | 返回由Hash对象中全部value组成的数组 |
student ={
"name" => "Steve",
"age" => 2;
"Gender" => "male"
}
p student.keys
p student.values
puts student.include?("age") #=>true
student.delete("Gender")
puts student.has_key?("Gender")