2010-10-09 4 views
17

Пусть у меня есть следующий Рубиновый код:Ruby: Массив, содержащийся в массиве, в любом порядке

array_1 = ['a', 'b'] 
array_2 = ['a', 'b', 'c'] 

some_function(array_1, array_2) # => True 
some_function(array_2, array_1) # => False 
some_function(['a', 'b'], ['a', 'd']) # => False 
some_function(['x', 'y'], array_2) # => False 

Я довольно много искал some_function вернуться Правда, когда параметр 2 содержит все элементов в параметре 1 .

ответ

42
def f a,b 
    (a-b).empty? 
end 
+0

Отлично. Спасибо! – Mike

+5

Это то, что мне нравится в Ruby - настолько кратким, понятным и понятным. –

+0

Viva Ruby ...: D –

-2
def f a,b 
    tmp = a.map(|i| b.include?(i)) 
    tmp.include?(false) 
end 
1

Из предыдущего поста,

def f a,b 
    (a-b).empty? 
end 

не будет работать так, как вы ожидаете, например:

a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
a2 = [2, 3, 5, 9] 

(a1-a2).empty? # returns true 

однако,

a1-a2 # returns [1, 4, 6, 7, 8], not empty 

таким образом f возвращает ложное.

Более точное решение, если вы хотите один лайнер будет:

def f a,b 
    a&b == b 
end 

a&b возвращает все элементы, которые в обоих a и b тогда мы проверяем, если это равно b

ради неоднозначности:

def f a,b 
    (a&b == a) || (a&b == b) 
end 
+0

Это потому, что вы должны поставить большой массив в первую очередь. Автор действительно спрашивает, является ли массив 'a' подмножеством' b'. Очевидно, что в вашем примере 'a1' не является подмножеством' a2' –

+0

'a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]'; 'a2 = [2, 3, 5, 9]'; '(a1-a2) .empty?' # => Возвращает 'false' !! ; Я сделал что-то не так, или вы? – Djunzu