Jaki jest najbardziej efektywny sposób sprawdzenia, czy tablica zawiera dowolny element z drugiej tablicy?
Dwa poniższe przykłady, próbując odpowiedzieć na pytanie, foods
zawierają elementy z cheeses
:
cheeses = %w(chedder stilton brie mozzarella feta haloumi reblochon)
foods = %w(pizza feta foods bread biscuits yoghurt bacon)
puts cheeses.collect{|c| foods.include?(c)}.include?(true)
puts (cheeses - foods).size < cheeses.size
any?
: Metoda zwraca true, jeśli blok kiedykolwiek zwróci wartość inną niż false lub zero.empty?
: Zwraca wartość true, jeśli self nie zawiera żadnych elementów.(cheeses & foods).any?
jest pytaniem OP: czy w serach są jakieś potrawy? W jego przykładzie „feta” występuje w obu, więc wynik powinien być prawdziwy, prawda? Po co więc sprawdzać.empty?
na skrzyżowaniu?[false, false, false]
, chociaż oczywiście nie jest pusta.Co powiesz na Enumerable # any?
Skrypt testowy:
Wynik:
źródło
cheeses
się w zestaw.any?, include?
byłem najszybszy, ustawiłem rozłączenie najwolniej: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Możesz sprawdzić, czy skrzyżowanie jest puste.
źródło
źródło
disjoint?
jest bardzo eleganckie, zwłaszcza w porównaniu do „any ?, include?”. Oryginalne pytanie dotyczyło zarówno elegancji, jak i wydajności..to_set
metoda może być przydatna tutajcheeses.to_set.disjoint?(foods.to_set)
źródło