替换索引与给定索引不匹配的数组中的元素

时间:2014-11-06 18:16:08

标签: ruby arrays indexing

我有以下两个变量:

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}}

4 个答案:

答案 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", "_"]