Сравнивая 2 массива символов - PullRequest
0 голосов
/ 24 сентября 2011

Я новичок в ruby, и я часами гуглял, но я не могу понять это. Похоже, это должно быть действительно легко, поэтому я очень расстроен.

Я работаю в ruby ​​и мне нужно сравнить 2 массива символов для истинного или ложного возврата.

array1 = [:a, :c]
array2 = [:a, :b, :c]

Сравнение, которое мне нужно сделать, состоит в том, чтобы увидеть, включает ли array2 все элементы array1. В этом случае array2 включает array1, но array1 не включает array2.

Я пытался:

array2.to_s.include?(array1.to_s) 

Который возвращает true, только если они находятся в одинаковом порядке, потому что для сравнения необходимо преобразовать его в строку. Так как он возвращает false (не то, что я ищу), но если array2 = [: a,: c,: b], это будет истиной. Есть ли более подходящий способ сделать это сравнение?

Ответы [ 3 ]

1 голос
/ 24 сентября 2011

ответ venj является штрафом для небольших массивов, но не может хорошо работать (это спорно) для больших массивов.Поскольку вы в основном выполняете операцию set («Является ли Set (array1) подмножеством Set (array2)?»), Имеет смысл посмотреть, как это делает собственная библиотека Ruby Set .Set имеет subset? метод , и, взглянув на его источник, мы видим, что он короткий и приятный:

def subset?(set)
  set.is_a?(Set) or raise ArgumentError, "value must be a set"
  return false if set.size < size
  all? { |o| set.include?(o) }
end

Мы могли бы просто создать два объекта Set из массивов и вызватьэто день, но так же легко перевести его в oneliner, который действует непосредственно на них:

array1 = [:a, :c]
array2 = [:a, :b, :c]

array1.length < array2.length && array1.all? {|el| array2.include? el }
# => true

array1 << :z
array1.length < array2.length && array1.all? {|el| array2.include? el }
# => false
1 голос
/ 24 сентября 2011

Вы можете использовать -. e.g.:

array1 - array2 #=> returns empty array, if array2 include all array1 elements. 

Надеюсь, что это может решить вашу проблему.

0 голосов
/ 24 сентября 2011

Вы можете добавить этот метод в класс Array.

#!/usr/bin/env ruby

class Array
  def includes_other(arr)
    raise "arr must be an Array" unless arr.kind_of? Array
    return (arr - self).length == 0
  end
end

arr1 = [:a, :c, :e]
arr2 = [:e, :a, :c, :d]

puts arr2.includes_other(arr1) # prints true

arr3 = [:x, :c, :e]

puts arr3.includes_other(arr1) # prints false
...