Как проверить, существует ли элемент в одном многомерном массиве Ruby в другом?
-
12-09-2019 - |
Вопрос
Я пытаюсь определить, существует ли элемент 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), и мы смотрим на размер результата для нашего ответа.