我有以下两个变量:
array = ['h','e','l','l','o']
string = '023'
array
中没有与string
中某个位置匹配的索引的['h','_','l','l','_']
中的所有元素都需要替换为下划线。新数组应如下所示:.map.with_index do |e,i|
if (i != string) #Somehow get it to check the entire string
e = '_'
end
end
。
我在考虑做这样的事情
{{1}}
答案 0 :(得分:2)
由于您已经知道要保留的位置,因此只需将其用作模式:
array = %w[ h e l l o ]
string = '023'
# Create a replacement array that's all underscores
replacement = [ '_' ] * array.length
# Transpose each of the positions that should be preserved
string.split(//).each do |index|
index = index.to_i
replacement[index] = array[index]
end
replacement
# => ["h", "_", "l", "l", "_"]
如果索引说明符发生更改,则需要重新编写该解析器以进行相应的转换。例如,如果您需要大于9的数字,则可以切换为逗号分隔。
答案 1 :(得分:1)
array = ['h','e','l','l','o']
string = '023'
当然,第一步是将string
转换为索引数组,它们可能应该首先存储的方式,部分是为了允许使用大于9的索引:
indices = string.each_char.map(&:to_i)
#=> [0, 2, 3]
一旦完成,有无数种方法可以进行替换。假设array
不被改变,这是一种非常直接的方式:
indices.each_with_object([?_]*array.size) { |i,arr| arr[i] = array[i] }
#=> ["h", "_", "l", "l", "_"]
如果您愿意,可以合并这两行:
string.each_char.map(&:to_i).each_with_object([?_]*array.size) do |i,arr|
arr[i] = array[i]
end
可替换地,
string.each_char.with_object([?_]*array.size) do |c,arr|
i = c.to_i
arr[i] = array[i]
end
答案 2 :(得分:1)
array.map.with_index{|x,i|!string.include?(i.to_s)?'-':x}
答案 3 :(得分:0)
这是我的解决方案:
string = %w[ h e l l o ]
indexes = '023'
(
0.upto(string.size - 1).to_a -
indexes.each_char.map(&:to_i)
).each do |i|
string[i]= '_'
end
puts string.inspect
# => ["h", "_", "l", "l", "_"]