2 Stimmen

Ruby If-Bedingung, die den gesamten Inhalt eines Arrays betrachtet

Im Grunde versuche ich, eine if-Bedingung zu schreiben, die den gesamten Inhalt eines Arrays betrachtet, um zu beurteilen, ob diese Bedingung wahr ist.

Im Grunde möchte ich das tun:

SubScale.all.each do |ss|
  if ss.key IN(scales)
    execute this code
  end
end

Wo Skalen in einem Array und ich möchte, dass der Code ausgeführt wird, wenn ss.key ein Eintrag in diesem Array ist.

5voto

Jeff Paquette Punkte 7021

Sie suchen nach Array#include ? :

scales.include?(ss.key)

4voto

Phrogz Punkte 283167

Allgemeiner als Array#include? -was eine Prüfung nach Wert erfordert- ist Enumerable#any? :

SubScale.all.each do |ss|
  # Run the code if the value is an exact match
  run_code if scales.include?(ss.key)
end

SubScale.all.each do |ss|
  # Run the code if the block returns a truthy value
  run_code if scales.any?{ |scale| scale.downcase == ss.key.downcase }
end

Wenn Sie eine exakte Übereinstimmung wünschen und die Geschwindigkeit ein Problem darstellt (Profil zuerst!), können Sie Speicher gegen Leistung tauschen, indem Sie einen Hash verwenden, um Ihren Schlüssel in O(1) statt O(n) Zeit zu suchen:

scale_lookup = Hash[ scales.map{ |s| [s,true] } ]
SubScale.all.each do |ss|
  run_code if scale_lookup[ss.key]
end

1voto

ennuikiller Punkte 44945

Scales.include?(ss.key) ist das, was Sie brauchen.

0voto

Victor Moroz Punkte 8971

Si scales hat viele Elemente, und das gilt auch für SubScale.all Ich würde vorschlagen, einen temporären Satz (oder Hash) zu erstellen:

require "set"

scales_set = Set.new(scales)

....each do |ss|
  if scales_set.include?(ss.key)
    ...
  end
end

Das könnte viel schneller gehen.

P.S. Hash scheint schneller zu sein als eingestellt:

scales_hash = scales.inject({}) { |h, e| h[e] = true; h }

....each do |ss|
  if scales_hash.has_key?(ss.key)
    ...
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X