Ruby学习笔记(10)_Hash

2017-10-13 19:16:44来源:CSDN作者:slowsnowscar人点击

分享

基本概念

哈希(Hash)是类似 “key” => “value” 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。
Hash 的索引(或者叫”键”)几乎可以是任何对象。
Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。

创建哈希

与数组一样,有各种不同的方式来创建哈希。

1.可以通过 new 类方法创建一个空的哈希:

h1 = Hash.newh1["one"] = "碧游宫"h1["two"] = "玉虚宫"h1 = {    "two" => "兜率宫"    "three" => 灌江口"}

如果在给Hash赋值时,使用的相同的key,那么后面的值会覆盖掉前面的值。另外,Ruby还提供了一种方便的创建和初始化Hash的方法,只需要在key后面加一个=>符号并跟一个值即可。每个key-value对用逗号隔开。然后整体用大括号括起来:

2.可以创建带有默认值的hash,不带默认值的hash是nil

months = Hash.new("month")#ormonths = Hash.new"month"

访问带有默认值的hash中任意键,如果键or值不存在, 那么返回默认值

实例:

#!/usr/bin/rubyH = Hash["a"=>100,"b"=>200]puts "#{H['a']}"puts H["b"]

结果:
100
200

可以使用任何Ruby对象作为键或值,设置可以使用数组,如下例

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

哈希内置方法

1.获取默认值或设置默认值

puts h1.defaulth1.default += "This is default value"

2.复制hash

和数组一样,我们可以把一个Hash变量分配给另一个hash变量,它们都引用想同的Hash,所以如果其中一个的值变了,那么另外一个的值也会跟着变:

h3 = h2h3["one"] = "玉虚宫"puts h2["one"] #=>"玉虚宫"

有的时候我们不希望上面的情况发生,即:修改了其中一个的值另一个也跟着修改了,我们可以使用clone方法make a new copy

h4 = h2h4["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.keysp student.valuesputs student.include?("age") #=>truestudent.delete("Gender")puts student.has_key?("Gender")

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台