Как проверить, существует ли элемент в одном многомерном массиве Ruby в другом?

StackOverflow https://stackoverflow.com/questions/1257489

Вопрос

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

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

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

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

Это было полезно?

Решение

suspects.any? do |suspect, _|
  criminals.any? do |criminal, _|
    suspect == criminal
  end
end

Другие советы

Быстрее вот так:

suspects.any? {|s,_| criminals.assoc(s)}

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


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

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

Как насчет:

(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.

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

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

=> true

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top