2012-01-19 14 views
51

配列a = [1,1,1,2,2,3]から要素を削除しようとしています。私は、次を実行した場合:配列から要素を削除するRuby

b = a - [1,3] 

それから私は得るでしょう:

b = [2,2] 

は、しかし、私は

b = [1,1,2,2] 

つまり、私が唯一の各要素の1つのインスタンスを削除する結果になりたいです減算されたベクトルは全ての場合ではない。これを行うにはRubyに簡単な方法がありますか?

あなたが行うことができます
+0

あなたが引く場合は '[1,1,3]は'あなたが終了したいです'b = [1,2,2]'で始まる?それとも決して起こることはありませんか? – seph

答えて

63

a= [1,1,1,2,2,3] 
delete_list = [1,3] 
delete_list.each do |del| 
    a.delete_at(a.index(del)) 
end 

結果:[1、1、2、2]

+1

したがって、配列減算は実際には互いに素になっていますか? –

+1

Array Difference ---元の配列のコピーである新しい配列を返し、other_aryにも現れるすべての項目を削除します。 (もしset-likeの振る舞いが必要な場合は、ライブラリクラスSetを参照してください。)[link](http://www.ruby-doc.org/core-1.9.3/Array.html) – Norm212

+2

すべてのインスタンスを削除する場合は'delete_list'にある項目のうち、あなたはこれを行うことができます。 'b = a.each.reject {| x | delete_list.each.include? x} ' – Archonic

2

非常にシンプルですがない:

a = [1,1,1,2,2,3] 
b = a.group_by {|n| n}.each {|k,v| v.pop [1,3].count(k)}.values.flatten 
=> [1, 1, 2, 2] 

はまたにおける倍数のためのケースを扱います「減数」:

a = [1,1,1,2,2,3] 
b = a.group_by {|n| n}.each {|k,v| v.pop [1,1,3].count(k)}.values.flatten 
=> [1, 2, 2] 

EDIT:これはmorですeは、Norm212と私の答えを組み合わせて機能的な解決策を作り出しました。必要に応じて

b = [1,1,3].each.with_object(a) { |del| a.delete_at(a.index(del)) } 

ラムダでそれを入れて:その後、

subtract = lambda do |minuend, subtrahend| 
    subtrahend.each.with_object(minuend) { |del| minuend.delete_at(minuend.index(del)) } 
end 

subtract.call a, [1,1,3] 
+0

いいえ、注文を変更することができます。 Norm212は注文を保存しているようです。 – seph

+0

@Michaelは編集を参照してください – seph

3
[1,3].inject([1,1,1,2,2,3]) do |memo,element| 
    memo.tap do |memo| 
    i = memo.find_index(e) 
    memo.delete_at(i) if i 
    end 
end 
関連する問題