Как проверить, существует ли элемент в одном многомерном массиве Ruby в другом? - PullRequest
2 голосов
/ 11 августа 2009

Я пытаюсь определить, существует ли элемент в одном многомерном массиве в другом аналогично структурированном массиве.

suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]

Ответ, который я ищу, является истинным или ложным. В приведенном выше примере ответ будет верным, потому что Rod существует в обоих массивах. Целочисленное значение в массиве второго уровня не имеет отношения.

Как бы я закодировал такой тест в типично Ruby-подобной краткости?

Ответы [ 5 ]

5 голосов
/ 11 августа 2009
suspects.any? do |suspect, _|
  criminals.any? do |criminal, _|
    suspect == criminal
  end
end
3 голосов
/ 11 августа 2009

Быстрее, как это:

suspects.any? {|s,_| criminals.assoc(s)}
2 голосов
/ 11 августа 2009

sepp2k опередил меня, но я должен представить, чтобы показать, насколько близко мы были в реализации:

<code>
suspects.find do |suspect_name, _|
  criminals.find {|criminal_name, _| criminal_name == suspect_name}
 end 

Мне нравится его использование любого ?, но думаю, что внутренний блок должен быть встроенным:)

0 голосов
/ 11 августа 2009

Я не обязательно рекомендую это, но другой однострочный вариант (два, если считать require) может быть таким:

require 'set'
(suspects.map{|s| s[0]}.to_set & criminals.map{|c| c[0]}.to_set).size > 0

=> true

Он строит массивы из первого элемента каждого элемента, а затем преобразует его в Set. Set имеет метод & (пересечение), и мы смотрим на размер результата для нашего ответа.

0 голосов
/ 11 августа 2009

Как насчет:

(suspect.size + criminal.size) > (suspect | criminals).size

Пример:

suspects = [['Rod', 100], ['Jane', 75], ['Freddy', 125]]
criminals = [['Bill', 75], ['Ted', 50], ['Rod', 75]]

guilty = (suspects.size + criminals.size) > (suspects | criminals).size
# Returns false. Since no common element was found in the merging.

criminals << ['Jane', 75]
guilty = (suspects.size + criminals.size) > (suspects | criminals).size
# Returns true. Since one element is common, merged array will be shorter by one.
...