【问题标题】: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

标签: arrays ruby string dictionary hashtable


【解决方案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"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      相关资源
      最近更新 更多