0

私は配列を持っています:

array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]

私はハッシュを持っています:

hash = {"one" => "Defined",
        "two" => "Test"
       }

各オブジェクトをループしてarray、そのオブジェクトにキーで見つかった部分文字列が含まれているかどうかを確認する必要がありhashます。見つかった場合は、hash値を返す必要があります。それ以外の場合は、 を返す必要がありundefinedます。最終的な目標は、次のような配列を作成することです。

final_array = ["Defined,"Test","Undefined","Defined"]

そのループを効果的に記述するにはどうすればよいですか?

4

2 に答える 2

2

ここにアプローチがあります:

array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]
hash = {"one" => "Defined","two" => "Test"}

array.map{|e| hash.find(proc{["undefined"]}){|k,v| e.downcase.include? k}.last}
# => ["Defined", "Test", "undefined", "Defined"]

説明:

Enumerable#findは良い考えです。ドキュメントが言っているように -列挙型の各エントリをブロックに渡します。block が false でない最初のものを返します。一致するオブジェクトがない場合は、ifnone を呼び出し、指定されている場合はその結果を返し、それ以外の場合は nil を返します。

を使用Array#mapし、各要素文字列をブロックに渡しました。今、私が呼んだブロックの中にい#findますhash。次に、各ペアをメソッド ブロックにhash.find渡します。そのブロック内でメソッドを呼び出し、キーを引数としてメソッドに渡します。テスト結果が である場合、その反復が返されます。それ以外の場合は、デフォルトの引数が実行されています。key/valuehash.findString#include?e#include?#include?truekey/valueproc{["undefined"]}.call

それが役立つことを願っています!

于 2013-10-20T17:17:27.560 に答える
0
hash = {"one" => "Defined", "two" => "Test"}
array = ["One is enough", "Two is a couple", "Where's the beef?", "One"]

hash.default = "Undefined"
keys = hash.keys
array.map {|a| hash[(a.split.map(&:downcase) & keys).first]}
  • ハッシュにキー「k」が含まれていない場合、ハッシュ[k] =>「未定義」
  • a.split.map(&:downcase) は、たとえば a = "One is Enough" を "one is enough" に変更します。
  • キーとの共通部分は、それぞれ ["one"]、["two"]、[nil]、["one"] に等しい
  • .first は、1 要素の配列からハッシュ キーを抽出することです。
  • ハッシュは、計算されたハッシュ キーで評価されます。 hash[nil] => "Undefined" (デフォルト)
于 2013-10-20T20:10:39.037 に答える