元素替换 - 红宝石
Posted
技术标签:
【中文标题】元素替换 - 红宝石【英文标题】:Element Replace - Ruby 【发布时间】:2022-01-21 12:38:08 【问题描述】:我正在尝试创建一个新数组,其中原始数组的元素被替换为哈希中的相应值。我想将 arr 中的每个元素与 hash 中的键进行比较,如果它们相等,则将它们铲入 arr 并在最后返回。为什么我的代码不起作用,如何访问/返回哈希中相应条目的键值,而不仅仅是键指向的值?如果你明白我在说什么。
def element_replace(arr, hash)
count = []
for i in arr do
if i == hash.key
count << value
else
count << i
end
end
return count
end
arr1 = ["LeBron James", "Lionel Messi", "Serena Williams"]
hash1 = "Serena Williams"=>"tennis", "LeBron James"=>"basketball"
print element_replace(arr1, hash1) # => ["basketball", "Lionel Messi", "tennis"]
puts
arr2 = ["dog", "cat", "mouse"]
hash2 = "dog"=>"bork", "cat"=>"meow", "duck"=>"quack"
print element_replace(arr2, hash2) # => ["bork", "meow", "mouse"]
puts
【问题讨论】:
另一种方式:Hash.new |h,k| h[k] = k .merge(hash1).values_at(*arr1) #=> ["basketball", "Lionel Messi", "tennis"]
.
您的代码不起作用,因为hash.key
返回第一个键值对的键。你想hash.has_key?(i)
。 value
也没有初始化,只是 nil
。
【参考方案1】:
def element_replace(arr, hash)
new_arr = []
arr.each |n|
if hash.has_key?(n)
new_arr << hash[n]
else
new_arr << n
end
return new_arr
end
arr1 = ["LeBron James", "Lionel Messi", "Serena Williams"]
hash1 = "Serena Williams"=>"tennis", "LeBron James"=>"basketball"
print element_replace(arr1, hash1) # => ["basketball", "Lionel Messi", "tennis"]
puts
arr2 = ["dog", "cat", "mouse"]
hash2 = "dog"=>"bork", "cat"=>"meow", "duck"=>"quack"
print element_replace(arr2, hash2) # => ["bork", "meow", "mouse"]
puts
【讨论】:
这是……答案吗?澄清要求?应用接受的答案后的最终代码?现在还不清楚。你能edit你的答案告诉我们这是什么以及你为什么将它作为答案发布吗? 是的,这是我的解决方案。我找到了一种让它工作的方法,所以我发布了让它工作的代码。【参考方案2】:如果您的哈希默认返回密钥,您可以使用default_proc
:
hash = 'Serena Williams' => 'tennis', 'LeBron James' => 'basketball'
hash.default_proc = proc |hash, key| key
这给了你:
hash['LeBron James'] #=> "basketball" # explicit value
hash['Lionel Messi'] #=> "Lionel Messi" # default value
或者,使用数组:
arr = ['LeBron James', 'Lionel Messi', 'Serena Williams']
hash.values_at(*arr)
#=> ["basketball", "Lionel Messi", "tennis"]
【讨论】:
【参考方案3】:Ruby 的Hash::fetch
将是一种获得所需结果的技术:
> players = ["LeBron James", "Lionel Messi", "Serena Williams"]
=> ["LeBron James", "Lionel Messi", "Serena Williams"]
> sports_data = "Serena Williams"=>"tennis", "LeBron James"=>"basketball"
=> "Serena Williams"=>"tennis", "LeBron James"=>"basketball"
> players.map |player| sports_data.fetch(player, player)
=> ["basketball", "Lionel Messi", "tennis"]
【讨论】:
在 Ruby 中有很多函数需要学习。我学习的第一个编程语言是 C/C++,所以虽然这些函数看起来像是上帝派来的,但我仍然习惯于“Ruby 方式”。【参考方案4】:您可以map 对数组进行散列键或保留数组元素本身:如果缺少键(返回nil
)保留数组元素:
arr1.map |k| hash1[k] || k
#=> ["basketball", "Lionel Messi", "tennis"]
【讨论】:
以上是关于元素替换 - 红宝石的主要内容,如果未能解决你的问题,请参考以下文章