Sample Array:
x = [1,2,3,4,2,2,2]
Filter:
y = [2,4,7,9]
Desired output:
result = [2,4,2,2,2]
I tried:
result = (x & y)
しかし、これは私に与えます[4,2]。
入手方法: result = [2,4,2,2,2]?
どうですか:
x - (x - y)
#=> [2, 4, 2, 2, 2]
@Markの回答より1〜2行長いですが、より効率的です(両方の配列が大きい場合):
require 'set'
keep = Set[2,4,7,9] # or Set.new(some_large_array)
result = x.select{ |n| keep.include?(n) } #=> [2, 4, 2, 2, 2]
書き方の問題…
x.select{ |i| y.include?(i) }
...これは、各配列の要素数が O(x*y) であることです。それぞれに 100 個の要素がある場合、最悪の場合でも 10,000 回の操作を行うことになります。私の答えは100回の操作しか行いません。
まず、Ruby では変数を大文字にしないでください。大文字化は、クラス名などの定数用です。
result = x.select {|i| y.include? i}
selectは とも呼ばれ、 Rubyfind_allのポジティブ フィルターです。ネガティブフィルターはreject. 中かっこの間には、任意のコードを入れることができます。のアイテムごとに 1 回実行されx(アイテムは引数として渡され、 になりますi)、呼び出し全体の結果には、ブロックが true 値を返すすべての要素が含まれます。