3

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]?

4

3 に答える 3

4

どうですか:

x - (x - y)
#=> [2, 4, 2, 2, 2]
于 2013-05-11T02:25:56.797 に答える
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回の操作しか行いません。

于 2013-05-10T23:14:41.927 に答える
1

まず、Ruby では変数を大文字にしないでください。大文字化は、クラス名などの定数用です。

result = x.select {|i| y.include? i}

selectは とも呼ばれ、 Rubyfind_allのポジティブ フィルターです。ネガティブフィルターはreject. 中かっこの間には、任意のコードを入れることができます。のアイテムごとに 1 回実行されx(アイテムは引数として渡され、 になりますi)、呼び出し全体の結果には、ブロックが true 値を返すすべての要素が含まれます。

于 2013-05-10T23:11:01.653 に答える