Ruby - 哈希表



哈希表是一个键值对的集合,例如:"employee" => "salary"。它类似于数组,但索引是通过任意类型的对象键进行的,而不是整数索引。

通过键或值遍历哈希表的顺序可能看起来是任意的,通常不会按照插入顺序排列。如果尝试使用不存在的键访问哈希表,则方法将返回nil

创建哈希表

与数组一样,创建哈希表的方法有很多种。可以使用new类方法创建一个空哈希表:

months = Hash.new

也可以使用new创建一个具有默认值的哈希表,否则默认为nil

months = Hash.new( "month" )

or

months = Hash.new "month"

当访问具有默认值的哈希表中的任何键时,如果键或值不存在,访问哈希表将返回默认值:

#!/usr/bin/ruby

months = Hash.new( "month" )

puts "#{months[0]}"
puts "#{months[72]}"

这将产生以下结果:

month
month

#!/usr/bin/ruby

H = Hash["a" => 100, "b" => 200]

puts "#{H['a']}"
puts "#{H['b']}"

这将产生以下结果:

100
200

可以使用任何 Ruby 对象作为键或值,甚至可以使用数组,因此以下示例是有效的:

[1,"jan"] => "January"

哈希表内置方法

我们需要一个哈希表对象实例才能调用哈希表方法。如我们所见,以下是如何创建一个哈希表对象实例:

Hash[[key =>|, value]* ] or

Hash.new [or] Hash.new(obj) [or]
Hash.new { |hash, key| block }

这将返回一个使用给定对象填充的新哈希表。现在使用创建的对象,我们可以调用任何可用的实例方法。例如:

#!/usr/bin/ruby

$, = ", "
months = Hash.new( "month" )
months = {"1" => "January", "2" => "February"}

keys = months.keys
puts "#{keys}"

这将产生以下结果:

["1", "2"]

以下是公共哈希表方法(假设hash是一个数组对象):

序号 方法和描述
1

hash == other_hash

测试两个哈希表是否相等,基于它们是否具有相同数量的键值对,以及键值对是否与每个哈希表中对应的对匹配。

2

hash.[key]

使用键从哈希表中引用值。如果找不到键,则返回默认值。

3

hash.[key] = value

value给出的值与key给出的键关联。

4

hash.clear

删除哈希表中的所有键值对。

5

hash.default(key = nil)

返回hash的默认值,如果未由default=设置,则返回nil。([]如果键在hash中不存在,则返回默认值。)

6

hash.default = obj

设置hash的默认值。

7

hash.default_proc

如果hash是由块创建的,则返回一个块。

8

hash.delete(key) [或]

array.delete(key) { |key| block }

通过keyhash中删除键值对。如果使用块,则如果找不到对,则返回块的结果。比较delete_if

9

hash.delete_if { |key,value| block }

对于块计算结果为true的每个对,从hash中删除键值对。

10

hash.each { |key,value| block }

迭代hash,为每个键调用一次块,并将键值作为两个元素的数组传递。

11

hash.each_key { |key| block }

迭代hash,为每个键调用一次块,将key作为参数传递。

12

hash.each_key { |key_value_array| block }

迭代hash,为每个key调用一次块,将keyvalue作为参数传递。

13

hash.each_key { |value| block }

迭代hash,为每个key调用一次块,将value作为参数传递。

14

hash.empty?

测试哈希表是否为空(不包含键值对),返回truefalse

15

hash.fetch(key [, default] ) [或]

hash.fetch(key) { | key | block }

返回hash中给定key的值。如果找不到key,并且没有其他参数,则引发IndexError异常;如果给出了default,则返回它;如果指定了可选块,则返回其结果。

16

hash.has_key?(key) [或] hash.include?(key) [或]

hash.key?(key) [或] hash.member?(key)

测试给定的key是否在哈希表中,返回truefalse

17

hash.has_value?(value)

测试哈希表是否包含给定的value

18

hash.index(value)

返回哈希表中给定valuekey,如果找不到匹配的值,则返回nil

19

hash.indexes(keys)

返回一个新数组,其中包含给定键的值。将为找不到的键插入默认值。此方法已弃用。使用select。

20

hash.indices(keys)

返回一个新数组,其中包含给定键的值。将为找不到的键插入默认值。此方法已弃用。使用select。

21

hash.inspect

返回哈希表的漂亮打印字符串版本。

22

hash.invert

创建一个新的hash,反转hash中的keysvalues;也就是说,在新哈希表中,hash的键成为值,值成为键。

23

hash.keys

创建一个包含hash键的新数组。

24

hash.length

返回hash的大小或长度(整数)。

25

hash.merge(other_hash) [或]

hash.merge(other_hash) { |key, oldval, newval| block }

返回一个新哈希表,其中包含hashother_hash的内容,用other_hash中的对覆盖hash中具有重复键的对。

26

hash.merge!(other_hash) [或]

hash.merge!(other_hash) { |key, oldval, newval| block }

与merge相同,但更改是在原地进行的。

27

hash.rehash

根据每个key的当前值重建hash。如果自插入以来值已更改,则此方法会重新索引hash

28

hash.reject { |key, value| block }

block计算结果为true的每个对创建一个新的hash

29

hash.reject! { |key, value| block }

reject相同,但更改是在原地进行的。

30

hash.replace(other_hash)

hash的内容替换为other_hash的内容。

31

hash.select { |key, value| block }

返回一个新数组,其中包含hashblock返回true的键值对。

32

hash.shift

hash中删除一个键值对,并将其作为两个元素的数组返回。

33

hash.size

返回hash的大小或长度(整数)。

34

hash.sort

hash转换为包含键值对数组的二维数组,然后将其作为数组排序。

35

hash.store(key, value)

hash中存储键值对。

36

hash.to_a

从哈希表创建二维数组。每个键/值对都转换为数组,所有这些数组都存储在一个包含数组中。

37

hash.to_hash

返回hash(自身)。

38

hash.to_s

hash转换为数组,然后将该数组转换为字符串。

39

hash.update(other_hash) [或]

hash.update(other_hash) {|key, oldval, newval| block}

返回一个新哈希表,其中包含hashother_hash的内容,用other_hash中的对覆盖hash中具有重复键的对。

40

hash.value?(value)

测试hash是否包含给定的value

41

hash.values

返回一个包含hash所有值的新数组。

42

hash.values_at(obj, ...)

返回一个新数组,其中包含与给定键关联的hash值。

广告