-1

据我所知,当我删除 Array.The 中的一个元素时,索引仍然向前移动。当我删除循环中的元素时,如何使索引静止?

下面只是一个例子。在这个例子中,我希望删除所有具有唯一 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

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

希望有人能帮忙,谢谢!

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

4

3 回答 3

0

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

a = some_array

Array.new(a.length)

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

或者

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

例如:删除偶数

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

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

#[1, nil, 3, nil, 5]
于 2013-11-04T06:33:33.293 回答
0

我认为您正在寻找#delete_if

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

您不应该从 #each 等迭代器中删除元素

于 2013-11-04T06:23:56.530 回答
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
于 2013-11-04T06:24:02.973 回答