迭代时将项插入数组

时间:2015-05-31 08:07:43

标签: arrays ruby iterator

如何在迭代数组时修改(添加/删除元素)数组并让迭代器知道它?

例如,我认为这段代码:

a = "1234567890".split("")
a.each_with_index{|d, i|
 if d.eql?('5')
  a.delete_at(i)
  a.insert(i, ['A', 'B', 'C'] )
 end
print d
}

会产生:1234ABC67890但会产生1234567890

是否有解决方法或不同方法才能使其正常工作?

(我知道这个例子是非常简单的例子,但是我正在做一些复杂的文本处理,当我点击一个关键词时我需要插入一些文本。我会在做扩展之前和之后做一堆函数这样做每个循环外部的插入[aka map!]会使我的代码变得复杂)

4 个答案:

答案 0 :(得分:1)

实际上,您的代码有效,您只需要将print d替换为print a[i],因为您要打印的是变量d而不是索引{{1}处的实际数组元素}

为什么不更改该索引上的元素,而不是删除和插入?

i

    a = "1234567890".split("")
    a.each_with_index{|d, i|
     if d.eql?('5')
      a[i] = ['A','B','C']
     end
    print a[i] #a[i] rather than d, since d contains the old value
    }

在迭代期间删除/插入数组是不鼓励的,因为它可能会导致令人头疼的问题...如果可能,请使用其他方法:)

注意: 我刚刚根据我的理解和给定的期望输出

使用了代码中的当前逻辑

数组将变为[1,2,3,4,['A','B','C'],6,7,8,9,0]而不是[1,2,3,4] , 'A', 'B', 'C',6,7,8,9,0]。如果你想要另一个,只需发表评论:)

如果你想要的只是改变字符串中的值,你可以使用 ... if d.eql?('5') a[i] = ['A','B','C'] d = a[i] end print d .tr来完成这项工作

答案 1 :(得分:0)

在迭代其成员时,通常无法修改Enumerable。在大多数此类情况下,您需要构建一个新的Enumerable。

b = []
a.each_with_index do |d, i|
  if d.eql?('5')
    b << 'A' << 'B' << 'C'
  else
    b << d
  end
end

答案 2 :(得分:0)

这是一个选项。如果要返回数组,请删除join,否则请将其保留为String

a = "1234567890".split("")
a.collect! {|i| i == '5' ? ['A', 'B', 'C'] : i }.flatten!.join #=> "1234ABC67890"

答案 3 :(得分:0)

最好避免在迭代时插入和删除。然而,当以相反的顺序迭代时,一些问题消失了:

a = "1234567890".split("")
a.reverse_each.with_index{|d, i|
 if d.eql?('5')
  a.delete_at(i)
  a.insert(i, ['A', 'B', 'C'] )
 end
}
puts a.join # => 12345ABC7890