哈希表

哈希表是一种和数组比较类似的数据结构。

哈希表的生成

哈希表也称为关联数组。和数组不同的是,可以使用任意的对象作为取出值的主键(相当于数组的下标)。在 {} 符号中间排列多个元素就生成了一个哈希表。

a = {"阿莱库斯"=>2000, "杰克"=>2003}

这个例子中,"阿莱库斯" 和 "杰克" 就是取出数值的主键,2000 和 2003 就是实际的值。直接生成哈希表时就这样使用 => 符号把主键和数值连接起来。

要取出哈希表中对象的时候,应按如下操作。

a = {"阿莱库斯"=>2000, "杰克"=>2003}
p a["阿莱库斯"]        # => 2000
p a["杰克"]            # => 2003
p a["小白兔"]          # => nil

从上例最后一行可以得知,当指定主键不存在时就会返回 nil。

这里是以字符串为主键,当然不使用字符串也可以。 即使主键只需要整数,编号不连续时使用哈希表会比使用数组更加方便。

另外,哈希表的反操作,也就是「检查与数值对应的主键」的情况下, 在 [] 中写入数值是不能得到其主键的。这里不再多作陈述, 要进行这种操作用到的是另一个方法。

向哈希表中添加值

实际操作中,比起在程序中直接指定数据来生成哈希表,更多的是先建立一个空的哈希表,然后向其中逐渐添加数据。生成一个空的哈希表只需写 {} 即可。

a = {}

向哈希表中添加值,和数组元素的赋值完全相同。

a = {}
a["阿莱库斯"] = 2000
p a                 # => {"阿莱库斯"=>2000}

哈希表的操作

哈希表是 Hash 类的对象。 同数组一样,可以调用这个类定义的方法对数据进行操作。

比如要从哈希表中删除数值的话,就要使用 delete 方法。

a = {"阿莱库斯"=>2000, "杰克"=>2003}
a.delete("杰克")
p a                 # => {"阿莱库斯"=>2000}

想知道哈希表中是否含有某个特定主键的情况下,就要使用 include? 方法。

a = {"阿莱库斯"=>2000, "杰克"=>2003}
p a.include?("阿莱库斯")    # => true
p a.include?("小白兔")      # => false

第三行中使用 include? 方法,是确认哈希表中是否含有主键 "阿莱库斯"。 上例在第一行生成哈希表时主键设有 "阿莱库斯",所以输出结果为 true(真)。 同样第四行是确认哈希表中是否含有主键 "小白兔"。 然而这个主键在哈希表中是不存在的,所以输出结果就为 false(伪)。

哈希表的循环

在哈希类中,有取得全部主键构成的数组的 keys 方法。

a = {3=>6, 4=>10, 5=>15}
p a.keys            # => [3, 4, 5]

这样就会输出 => 左侧的主键构成的数组。

前一章数组的最后使用了迭代器,我们使用这个来对哈希表的主键进行循环。

a = {3=>6, 4=>10, 5=>15}
a.keys.each do |k|
  p k
end

执行这段代码会输出 3, 4, 5。

此外,使用 values 方法可以获得哈希表的值构成的数组。

a = {3=>6, 4=>10, 5=>15}
a.values.each do |v|
  p v
end

执行这段代码会输出 6, 10, 15。

此外,旧版本的 Ruby 哈希表的存储顺序是不确定的。但 RGSS3 使用的 Ruby 1.9 开始确保了哈希表的顺序。

a = {3=>6, 5=>15, 4=>10}
a.keys.each do |k|
  p k
end

像这样更改了输入顺序,输出的顺序也会变为 3, 5, 4。