元素替换 - 红宝石

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) #=&gt; ["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"]

【讨论】:

以上是关于元素替换 - 红宝石的主要内容,如果未能解决你的问题,请参考以下文章

如何从最后一个元素开始遍历数组? (红宝石)

科普红宝石 Ruby

回顾一下红宝书中获取元素特性的三个方法

Day3 js红宝书阅读笔记

使用 ruby​​、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?

如何递归地用“”替换红宝石哈希中的所有零值?