哈希的基本操作

Ruby Hash的常用函数

2013年07月25日 20:55:01

阅读数:3102

1Hash表的生成

使用第一种形式时,参数的个数必须是偶数.(奇数位参数是索引,偶数位参数是元素值).

使用第二种形式(将一个哈希表对象指定给参数)时, 将生成并返回一个与指定哈希表相

同的全新的哈希表.(生成的哈希表的默认值为nil.).

 

a)      由[索引, 值, ...] 型的数组变为哈希表

ary = [1,"a", 2,"b",3,"c"]

p Hash[*ary]                                           #=> {1=>"a", 2=>"b", 3=>"c"}

 

b)      由索引和值配对出现的数组变为哈希表

alist =[[1,"a"], [2,"b"], [3,"c"]]

p Hash[*alist.flatten]                           #=>{1=>"a", 2=>"b", 3=>"c"}

 

c)      由索引数组和值数组配对生成哈希表

keys = [1, 2, 3]

vals = ["a", "b", "c"]

alist = keys.zip(vals)   # 或 alist = [keys,vals].transpose

p Hash[*alist.flatten]                 #=>{1=>"a", 2=>"b", 3=>"c"}

 

d)      直接赋值法生成哈希表

h = Hash.new

alist = [[1,["a"]], [2,["b"]],[3,["c"]]]

alist.each {|k,v|

  h[k] = v

}

p h                                                             #=>{1=>["a"], 2=>["b"], 3=>["c"]}

Hash.new([ifnone])

Hash.new {|hash, key| ...}

 

2hash的常用方法

1、[]

self[key]

返回索引为key的哈希表元素的值.若该索引并未注册,则返回默认值(若未设定则为nil).若想区分该nil到底是默认值还是哈希表元素值时,使用fetch.

 

2、self[key]=value、store(key,value)

将索引为key的元素值设为value.返回value.

 

3、clear

清空哈希表的内容. 返回self.

 

4、clone、dup

返回一个与receiver内容一致的新哈希表. 对冻结的哈希表进行clone时将返回一个同样的冻结的哈希表.但使用dup时,将返回内容相同但却并未冻结的哈希表.

 

5、default、default([])

default、default([key])

返回哈希表的默认值.

 

6、default=value

将哈希表的默认值设为value.若使用无对应值的索引进行搜索时,将返回该值.

 

7、delete

delete(key)、delete(key) {|key| ... }

删除索引key与对应元素之间的关系.返回被删除的值.若没有值与key相对应,则返回nil.

 

8、 reject

reject {|key, value| ... }、reject! {|key, value| ... }、delete_if {|key, value| ... }

拷贝self之后对块进行计算,若计算值为真则删除相应的哈希表元素,最后返回该哈希表.

key和value当做参数来计算块,若计算值为真则删除相应的元素.

通常delete_if返回self. reject!就有所不同,若未删除元素时返回nil,除此之外则返回self.

 

9、each、each_pair

each {|key, value| ... }、each_pair {|key, value| ... }

以key和value为参数对块进行计算.返回self.

例:

{:a=>1, :b=>2}.each_pair {|k, v| p [k, v]}

# => [:a, 1]

     [:b, 2]

 

each和each_pair的块参数交接方法有所不同.

each:      yield([key, val])

each_pair: yield(key, val)

 

10、each_key

         each_key {|key| ... }

key为参数来计算块.返回self.

 

11、each_value

each_value {|value| ... }

以value为参数来计算块.返回self.

 

12、empty?

若哈希表为空则返回真.

 

13、fetch

         fetch(key[, default])、fetch(key) {|key| ... }

返回与索引key对应的元素的值.若该索引未被注册则分为两种情况: 若给出了参数default的话,就返回它的值;若给出了块时,将返回块的计算值.除此之外将引发IndexError异常.

 

14、has_key?、include?、key?、member?

has_key?(key)、include?(key)、key?(key)、member?(key)

key是哈希表的索引则返回真.

 

15、has_value?、value?

has_value?(value)、value?(value)

value是哈希表的元素值则返回真.对值进行判断时使用==操作符.

 

16、index

index(val)

返回与val对应的索引.若无法对应时返回nil。若有若干个对应的索引时,则会随机地返回其中之一.

 

17、indexes、indices

indexes(key_1, ... , key_n)、indices(key_1, ... , key_n)

以数组的形式返回与参数所指的索引相对应的元素值.

 

18、invert

将元素值和索引互换,返回变换后的哈希表.若原哈希表中若干不同的索引对应相同的元素值时,其变换结果将无法预测.

例:

h = { "n" => 100, "m" => 100,"y" => 300, "d" => 200, "a" => 0 }

h.invert   #=>{200=>"d", 300=>"y", 0=>"a",100=>"n"}

 

19、keys

返回一个包含所有索引的数组.

 

20、length、size

返回哈希表中的元素的个数.

 

21、merge

merge(other)

merge(other) {|key, self_val, other_val| ... }

merge!(other)

merge!(other) {|key, self_val, other_val| ... }

Hash#merge等同于hash.dup.update.而Hash#merge!则是Hash#update的别名.

self和other中包含相同索引时将按照下列两种方式来处理: 若带块则调用该块,然后由用户选择使用哪个值;不带块的话则通常使用other的值.

 

22、rehash

重新计算索引对应的哈希表值。当与索引对应的哈希表值发生变化时,若不使用该方法来重新计算的话,将无法取出与索引对应的哈希表值。

 

23、replace

replace(other)

other的内容来替换哈希表的内容。返回self。

24、to_a

生成并返回一个数组,数组中的元素也是数组,且由[key,value]构成。

 

25、to_hash

返回self

 

26、update

update(other)、update(other){|key, self_val, other_val| ... }

合并哈希表的内容。若出现相同索引时,将使用other中对应的元素值。

                   例:

foo = {1 => 'a', 2 => 'b', 3 => 'c'}

bar = {1 => 'A', 2 => 'B', 3 => 'C'}

p foo.dup.update(bar)                   # =>{1=>"A", 2=>"B", 3=>"C"}

p foo.dup.update(bar) {|k,v| v}         # => {1=>"a",2=>"b", 3=>"c"}

返回self

 

27、values

返回一个包括哈希表中的所有元素值的数组。

 

28、values_at(key_1, ... ,key_n)

返回一个数组,该数组包括与参数所指索引相对应的哈希表元素值。若没有与索引相对应的哈希表元素值时,将使用default的值。与indexes以及indices相同。

例:

h = {1=>"a", 2=>"b", 3=>"c"}

ph.values_at(1,3,4)               # =>["a", "c", nil]

猜你喜欢

转载自www.cnblogs.com/lv-books/p/9084223.html