-1

私が知っているように、配列の要素を削除すると、インデックスはまだ前方に移動します。ループ内の要素を削除するときにインデックスを静止させるにはどうすればよいですか?

以下はほんの一例です。この例では、一意の 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 finally を使用します。私を助けてくれたすべての返信に感謝します。

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 に答える