Was ist der effizienteste Weg, um zu testen, ob ein Array ein Element aus einem zweiten Array enthält?
Zwei Beispiele unten, die versuchen, die Frage zu beantworten, foods
enthalten ein Element aus 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?
: Die Methode liefert true , wenn der Block jemals einen anderen Wert als false oder nil zurückgibt.empty?
: Gibt true zurück, wenn self keine Elemente enthält.(cheeses & foods).any?
nicht die Frage des OP ist: Sind Lebensmittel in Käse? In seinem Beispiel ist "Feta" in beiden enthalten, also sollte das Ergebnis wahr sein, oder? Warum also.empty?
an der Kreuzung nachsehen?[false, false, false]
, obwohl es offensichtlich nicht leer ist.Wie wäre es mit Enumerable # any?
Benchmark-Skript:
Ergebnis:
quelle
cheeses
in ein Set verwandeln .any?, include?
war der Schnellste, disjunkt am langsamsten: gist.github.com/jaredmoody/d2a1e83de2f91fd6865920cd01a8b497Sie können überprüfen, ob die Kreuzung leer ist.
quelle
quelle
disjoint?
es auch sehr elegant, besonders im Vergleich zu "any?, Include?". Die ursprüngliche Frage bezog sich sowohl auf elegant als auch auf effizient..to_set
Methode kann hier nützlich seincheeses.to_set.disjoint?(foods.to_set)
quelle