Ruby学习笔记(10)_Hash

基本概念

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

创建哈希

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

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

h1 = Hash.new
h1["one"] = "碧游宫"
h1["two"] = "玉虚宫"

h1 = {
    "two" => "兜率宫"
    "three" => 灌江口"
}

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

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

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

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

实例:

#!/usr/bin/ruby

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

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

结果:
100
200

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

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

哈希内置方法

1.获取默认值或设置默认值
puts h1.default
h1.default += "This is default value"
2.复制hash

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

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

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

h4 = h2
h4["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.keys
p student.values
puts student.include?("age") #=>true
student.delete("Gender")
puts student.has_key?("Gender")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值