哈希表

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

哈希表的生成

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

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。