首页 » Ruby » Ruby学习笔记(10)_Hash

Ruby学习笔记(10)_Hash

原文 http://blog.csdn.net/slowsnowscar/article/details/78224893

2017-10-13 15:20:18阅读(501)

基本概念

哈希(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")

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹