如果密钥存在,添加一些哈希值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果密钥存在,添加一些哈希值?相关的知识,希望对你有一定的参考价值。

我在Ruby中有一个哈希:

hash = Hash.new

它有一些关键的价值对,比如说:

hash[1] = "One"
hash[2] = "Two"

如果哈希包含密钥2,那么我想在其值中添加“Bananas”。如果哈希没有密钥2,我想创建一个新的密钥值对2=>"Bananas"

我知道我可以通过首先使用2检查散列是否具有密钥has_key?,然后相应地采取行动。但这需要一个if声明和多行。

那么有一个简单,优雅的单线程来实现这一目标吗?

答案

这有效:

hash[2] = (hash[2] || '') + 'Bananas'

如果您希望所有键都以这种方式运行,您可以使用Ruby的哈希的“默认”功能:

hash = {}
hash.default_proc = proc { '' }
hash[2] += 'Bananas'
另一答案
(hash[2] ||= "").concat("Bananas")
另一答案

您可以将散列的默认值设置为空字符串,然后使用<<运算符来连接传递的任何新值:

h = Hash.new("")
#=> {}
h[2] << "Bananas"
#=> "Bananas" 
h
#=> {2=>"Bananas"} 
h[2] << "Bananas"
#=> "BananasBananas" 

根据@ rodrigo.garcia的评论,这种方法的另一个副作用是Hash.new()设置哈希的默认返回值(可能是也可能不是你想要的)。在上面的示例中,该默认值是一个空字符串,但它不必是:

h2 = Hash.new(2)
#=> {}
h2[5] 
#=> 2
另一答案

从技术上讲,你的道路都通往同一个地方。因此,Hash[2] = "bananas"产生的结果与首先检查密钥2的哈希值相同。但是,如果您确实需要检查哈希的过程由于某种原因,那么使用.has_key?方法和基本的if条件。

假设有一个哈希,

`Hash = { 1 => "One", 2 => "Two" }`

根据键搜索的真值设置一段代码,

if hash.has_key?(2) == true hash[2] = "bananas" else hash[2] = "bananas" end

或者更简单地说,

hash.has_key?(2) == true ? hash[2] = "bananas" : hash[2] = "bananas"

另一答案

您可以使用块初始化哈希,然后直接连接:

hash = Hash.new {|hash, key| hash[key] = ""}
hash[1] << "One"
hash[2] << "Two"
hash[2] << "Bananas"

{1=>"One", 2=>"TwoBananas"}

以上是关于如果密钥存在,添加一些哈希值?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理相同的哈希与相同的密钥?

多值字典?

如何检查密钥是不是存在于深层 Perl 哈希中?

如何一次获取多个哈希值?

检查 JSON 密钥是不是存在

使用powershell匹配密钥时获取空哈希值