散列是一种用于以UNIQUE键值对形式存储数据的数据结构。与数组不同,没有数字索引,您可以使用键访问哈希值。
示例包括:
- 国家名称及其对应国家代码的列表(例如ES =>西班牙)
- 字典,其中每个单词都有可能的定义的列表
- 域名及其IP地址
当您拥有(或可以转换为)这种类似于字典的格式的数据时,哈希可以加快代码的速度。
好。
我们大致了解什么是哈希,但是如何创建哈希呢?
像这样:
- { }
那是一个空的哈希!
具有三个键/值对的哈希看起来像这样:
- { a:1 ,b:2 ,c:3 }
其中
a
是键,并且1
是该键的对应值。请注意,键值对以逗号分隔。获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
现在:
让我们看看如何在Ruby项目中使用常见的哈希方法使用哈希。
将值存储在Ruby哈希中
正如我们已经看到的,您可以使用一组初始值创建哈希。
这是另一个例子:
- 水果= { 椰子:1 ,苹果:2 ,香蕉:3 }
另一种选择是将新值添加到现有哈希中。
像这样:
- 水果[ :orange ] = 4
这是
:orange
作为哈希键4
及其对应的值。为什么
:orange
在访问值时在单词前冒号,而orange:
在创建哈希时在单词后冒号?这是一种更好的语法,它允许您创建没有哈希=>
符号()的哈希,这是一种有效的旧方法。值可以是任何Ruby对象。
包括:
- 弦乐
- 整数和浮点数
- 数组
键也可以是任何东西,但是符号(例如
:banana
)和字符串是您会发现的最常见的键类型。请记住...
密钥是唯一的,我们只能有一个
:orange
或一个:apple
密钥。当您两次添加同一密钥时,将更改其值。
如何从哈希访问值
您通过密钥访问哈希。
如果您需要直接访问这些值,则哈希可能不是您数据的正确结构。
范例:
- 水果[ :orange ]
- #4
这是散列的全部要点,可通过其键快速查找项目。
如果键不存在,您将得到
nil
。- 水果[ :桃子]
- #无
或者,您可以使用
fetch
方法,该方法允许您提供默认值。范例:
- 水果。提取(:peach ,0 )
如果不使用
fetch
默认值(第二个参数),则Ruby将引发KeyError
异常。这很有用,因为您会知道缺少什么密钥。
如何合并两个Ruby哈希
您可以采用两个哈希并将它们合并到一个新的哈希中。
这是什么方法?
好吧,不难猜测这一点。该方法的名称是
merge
。使用方法如下:
- 默认值= { a:1 ,b:2 ,c:3 }
- 偏好= { c:4 }
- 默认值。合并!(首选项)
- #{:a => 1,:b => 2,:c => 4}
请注意,由于键是唯一的,因此新值将覆盖旧值。
您可以将这一事实用于有趣的解决方案,例如创建“默认”哈希,用户可以通过传递自己的哈希来覆盖它。
如果您需要对键的合并方式进行更多控制,则可以传递一个块。
像这样:
- 默认值。合并!(首选项){ |键,旧,新| [ 旧,新] 。最大}
哪里
old
是从哪里来的值defaults
,并且new
是该值来自何处preferences
。一键有多个值
在字典中...
单词是唯一的,但它们可以具有与之关联的多个值(定义)。
您可以在Ruby中做到这一点!
范例:
- 字典= {
- 机会:[
- “在某种情况下可以做某事” ,
- “有利于达成目标的情况或条件”
- ] ,
- 创造力:[
- “利用想象力或原创思想创造新事物” ,
- “创造能力” ,
- “以新方式结合现有观念而产生新观念的过程”
- ]
- }
- 字典[ :creativity ] [ 1 ]
Where
dictionary[:creativity]
给您一个数组,[1]
并给您该数组中的第二个元素。换句话说:
键是一个符号,值是数组。当您访问哈希时,您将获得一个通常可以访问的数组,就像其他数组一样。
如何对哈希进行排序
您可以对数组进行排序。但是您知道您也可以对散列进行排序吗?
当你
sort
的哈希,它是由键排序。范例:
- { b:1 ,a:2 } 。分类
- #[[:: a,2],[:b,1]]
但是您也可以按值对它们进行排序:
- { c:3 ,b:1 ,a:2 } 。sort_by (&:last )
您会注意到,对哈希进行排序得到的不是另一个哈希…
这是一个数组!
但是您可以使用
to_h
方法将该数组转换回哈希。从哈希中获取所有键和值
如果您需要所有按键的列表,这是个好消息,那么有一种方法!
这里是:
- { 苹果:1 ,香蕉:2 } 。键
- #[:apple,:banana]
还有一种求值的方法:
- { 苹果:1 ,香蕉:2 } 。价值观
- #[1,2]
如果您想知道哈希中是否存在键,请使用
key?
方法。