当我删除Array.each循环中的元素时,如何使索引仍然存在?

时间:2013-11-04 06:17:31

标签: ruby

据我所知,当我删除Array中的元素时。索引仍然向前移动。当我删除循环中的元素时,如何使索引保持不变?

以下只是一个例子。在这个例子中,我希望删除具有唯一num的所有元素,但最后仍然留下num'2'。

class Test
  attr_accessor :num
  attr_accessor :job
  def initialize(num,job)
    @num = num
    @job = job
  end
end

a = []

a << Test.new(1,'jobA')
a << Test.new(2,'jobB')
a << Test.new(1,'jobC')
a << Test.new(3,'jobD')

b = Hash.new

a.each_with_index do |i,index|
  #puts i.num,index
  if b[i.num] == nil
    b[i.num] = true
    a.delete(i)
  end
end

a.each do |i|
  puts i.num,i.job
end

# it shows:
# 2 jobB
# 1 jobC

# I hope to get only:
# 1 jobC

在这个新例子中,我希望'jobC'留下重复的数字'1',并希望删除其他唯一的num元素。

希望有人能提供帮助,谢谢!

我最后使用delete_if,感谢您的所有回复来帮助我。

3 个答案:

答案 0 :(得分:0)

我认为你正在寻找#delete_if

  • 此方法允许您指定测试 - 如果元素通过测试,则将其删除。
  • #clear用于无条件删除所有元素

您不应该从诸如#each

之类的迭代器中删除元素

答案 1 :(得分:0)

我不确定我是否理解了您正确操作此操作的逻辑,或者您可能需要重新考虑为何以这种方式接近它,但这样的事情可能对您有效,而不是.each

a = (1..5).to_a

a.reject! do |c| 
  puts c # or perform other operations on the element
  true
end

puts a.inspect

答案 2 :(得分:0)

如果你只想保持那个长度相同的数组并用nil替换所有值,那么

a = some_array

Array.new(a.length)

#[nil, nil, nil, nil, nil]

或者

如果您只想删除某些值并保留其他元素的索引,请执行

对于Ex:删除偶数

a = [1,2,3,4,5]

a.each_with_index { |num, index| a[index] = nil if num % 2 == 0 } 

#[1, nil, 3, nil, 5]