据我所知,当我删除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,感谢您的所有回复来帮助我。
答案 0 :(得分:0)
答案 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]