【Ruby on Rails全栈课程】2.8 ruby的数据结构--哈希(Hash)

简介: 1、哈希(Hash)哈希也是存储对象的一个集合,哈希里面的元素是以"key" => “value”(键值对)这样的形式存在的,元素是没有顺序的,哈希的键可以是任意对象,键必须的唯一的,键通常用符号(Symbol)表示。哈希的创建有两种形式,两种形式都是一样的,最常使用第二种:

1、哈希(Hash)


哈希也是存储对象的一个集合,哈希里面的元素是以"key" => “value”(键值对)这样的形式存在的,元素是没有顺序的,哈希的键可以是任意对象,键必须的唯一的,键通常用符号(Symbol)表示。


哈希的创建有两种形式,两种形式都是一样的,最常使用第二种:


irb(main):108:0> hash_1 = {:name => "Mary",:age => 12}
=> {:name=>"Mary", :age=>12}
irb(main):109:0> hash_2 = {name:"Mary",age:12}
=> {:name=>"Mary", :age=>12}


2、类型转换


(1)哈希转字符串to_s


irb(main):110:0> hash = {name:"Mary",age:12}
=> {:name=>"Mary", :age=>12}
irb(main):111:0> hash_str = hash.to_s
=> "{:name=>\"Mary\", :age=>12}"


(2)字符串转哈希eval,字符串必须是将hash转成字符串的那种格式,不是任意字符串都可以转成hash。通常用于从文件中读取hash的情况。


#定义一个字符串,字符串是将hash转成字符串的格式
irb(main):111:0> hash_str = "{:name=>\"Mary\", :age=>12}"
irb(main):112:0> eval(hash_str)
=> {:name=>"Mary", :age=>12}
#随便定义一个字符串
irb(main):113:0> str = "hello"
=> "hello"
#eval会报错,eval转换的字符串必须是将hash转成字符串的格式
irb(main):114:0> eval(str)
NameError: undefined local variable or method `hello' for main:Object
Did you mean?  help
  from (irb):114:in `eval'
  from (irb):114:in `eval'
  from (irb):114


3、哈希操作


(1)== 判断两个哈希是否相等,要求每个键值对的类型和内容都相等,不要求顺序也一样,因为哈希中的元素是没有顺序的


irb(main):116:0> h1 = {7 => 35, "c" => 2, "a" => 1}
=> {7=>35, "c"=>2, "a"=>1}
irb(main):117:0> h2 = {"c" => 2, "a" => 1, 7 => 35}
=> {"c"=>2, "a"=>1, 7=>35}
irb(main):118:0> h3 = {:c => 2, :a => 1, 7 => 35}
=> {:c=>2, :a=>1, 7=>35}
irb(main):119:0> h1 == h2
=> true
#h2、和h3中元素的区别是键的类型,:c为符号类型、"c"为字符串类型,所以两个hash不相等
irb(main):120:0> h2 == h3
=> false


(2)hash[key] 通过key取哈希的值


irb(main):121:0> hash = {7 => 35, "c" => 2, "a" => 1}
=> {7=>35, "c"=>2, "a"=>1}
irb(main):122:0> hash[7]
=> 35
irb(main):123:0> hash["c"]
=> 2
#hash中不包含key值为:c的键,返回nil
irb(main):124:0> hash[:c]
=> nil


(3)hash[key] = value 如果key值已存在,则将key对应的值替换为value。如果key值不存在,则新建key => value 键值对


irb(main):125:0> hash = {7 => 35, "c" => 2, "a" => 1}
=> {7=>35, "c"=>2, "a"=>1}
#key为7已存在,7所对应的值被替换成888
irb(main):126:0> hash[7] = 888
=> 888
#key为:c不存在,新建:c=>3键值对
irb(main):127:0> hash[:c] = 3
=> 3
irb(main):128:0> hash
=> {7=>888, "c"=>2, "a"=>1, :c=>3}


(4)hash.delete(key) 删除key所在的键值对,并返回key所对应的value值


irb(main):129:0> hash = {7 => 35, "c" => 2, "a" => 1}
=> {7=>35, "c"=>2, "a"=>1}
irb(main):130:0> hash.delete("c")
=> 2
#hash中不包含key值为:c的键,返回nil
irb(main):131:0> hash.delete(:c)
=> nil


(5)hash.delete_if {| key,value | block } 删除满足block条件的键值对


irb(main):132:0> hash = {"1" => 100, "2" => 200, "3" => 300}
=> {"1"=>100, "2"=>200, "3"=>300}
#删除掉value的值大于280的键值对
irb(main):133:0> hash.delete_if {|key,value| value > 280}
=> {"1"=>100, "2"=>200}
#现在hash中的元素
irb(main):134:0> hash
=> {"1"=>100, "2"=>200}


(6)each 遍历哈希


hash.each {| key,value | block } 遍历每个键值对


hash.each_key {| key | block } 遍历每个键


hash.each_value {| value | block } 遍历每个值


#用第二种形式定义hash,是不是比第一种的简单
irb(main):140:0> hash = {a:100,b:200,c:300}
=> {:a=>100, :b=>200, :c=>300}
#遍历键值对,块中有两个变量,第一个变量是键,第二个变量是值
irb(main):141:0> hash.each {|key,value| puts "键为#{key},值为#{value}"}
键为a,值为100
键为b,值为200
键为c,值为300
=> {:a=>100, :b=>200, :c=>300}
#只遍历键,块中的变量是键
irb(main):142:0> hash.each_key {|key| puts "键为#{key}"}
键为a
键为b
键为c
=> {:a=>100, :b=>200, :c=>300}
#只遍历值,块中的变量是值
irb(main):143:0> hash.each_value {|value| puts "值为#{value}"}
值为100
值为200
值为300
=> {:a=>100, :b=>200, :c=>300}


(7)hash.empty? 判断哈希是否为空,为空返回true,否则返回false

irb(main):001:0> h_1 = {}
=> {}
irb(main):002:0> h_1.blank?
=> true


(8)include 判断哈希中是否有某个值


hash.include?(key) 判断哈希中是否有键key,有返回true,没有返回false


hash.has_key?(key) 与include?方法同样用法


hash.has_value?(value) 判断哈希中是否有值value,有返回true,没有返回false


irb(main):003:0> hash = {a:100,b:200,c:300}
=> {:a=>100, :b=>200, :c=>300}
irb(main):004:0> hash.include?(100)
=> false
irb(main):005:0> hash.include?(:a)
=> true
irb(main):006:0> hash.has_value?(100)
=> true


(9)数组形式返回键、值

hash.keys 以数组的形式返回哈希所有的key

hash.values 以数组的形式返回哈希所有的value

irb(main):007:0> hash = {a:100,b:200,c:300}
=> {:a=>100, :b=>200, :c=>300}
irb(main):008:0> hash.keys
=> [:a, :b, :c]
irb(main):009:0> hash.values
=> [100, 200, 300]


(10)hash.length 哈希的长度

irb(main):010:0> hash = {a:100,b:200,c:300}
=> {:a=>100, :b=>200, :c=>300}
irb(main):011:0> hash.length
=> 3


(11)hash_1.merge(hash_2) 将hash_1和hash_2两个哈希里面的元素合起来,返回一个新的哈希,如果hash_1和hash_2两个哈希里面有相同的key值,则key对应的值以后面的哈希(即hash_2)中的值为准。


hash_1.merge(hash_2) hash_1的值不会改变


hash_1.merge!(hash_2) hash_1的值会改变


irb(main):012:0> hash1 = {a:100,b:200}
=> {:a=>100, :b=>200}
irb(main):013:0> hash2 = {b:300,d:400}
=> {:b=>300, :d=>400}
irb(main):014:0> hash1.merge(hash2)
=> {:a=>100, :b=>300, :d=>400}
#hash1中的值没有改变
irb(main):016:0> hash1
=> {:a=>100, :b=>200}
#merge!
irb(main):017:0> hash1.merge!(hash2)
=> {:a=>100, :b=>300, :d=>400}
#hash1中的值发生了改变
irb(main):018:0> hash1
=> {:a=>100, :b=>300, :d=>400}


(12)reject、select返回不满足条件或者满足条件的键值对


hash.reject {|key,value| block} 返回所有不满足block条件的元素,hash本身不会改变


hash.reject! {|key,value| block} 返回所有不满足block条件的元素,hash本身会改变


hash.select {|key,value| block} 返回所有满足block条件的元素,hash本身不会改变


hash.select! {|key,value| block} 返回所有满足block条件的元素,hash本身会改变


irb(main):019:0> hash = {a:100,b:200,c:300}
=> {:a=>100, :b=>200, :c=>300}
irb(main):020:0> hash.reject {|k,v| v > 200}
=> {:a=>100, :b=>200}
irb(main):021:0> hash.select {|k,v| v > 200}
=> {:c=>300}
目录
相关文章
|
10月前
|
人工智能 IDE 开发工具
JetBrains RubyMine 2025.1 发布 - 最智能的 Ruby 与 Rails IDE
JetBrains RubyMine 2025.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE
319 30
JetBrains RubyMine 2025.1 发布 - 最智能的 Ruby 与 Rails IDE
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
515 0
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
245 0
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
182 0
|
存储 缓存 NoSQL
redis数据结构-hash
redis数据结构-hash
256 0
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
1162 1

热门文章

最新文章