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 値を返すすべての要素が含まれます。