2

コード文字列項目を含む複数の配列があります。特定の文字列からコードを照合し、一致した配列からクラス名を返す必要があります。

私が持っているものを見せたらもっと良いかもしれません。以下は配列で、この下には、指定された文字列が配列内の項目と一致する場合に返す必要がある文字列があります。したがって、「329」の文字列を送信すると、「ss4」が文字列として返されるはずです。

['392', '227', '179', '176']
= 'ss1'

['389', '386']
= 'ss2'

['371', '338', '335']
= 'ss3'

['368', '350', '332', '329', '323', '185', '182']
= 'ss4'

これに最適なアプローチは何かを知る必要があります。ヘルパー メソッドを作成し、コード ブロックごとに配列を作成し、各配列をチェックして、指定された文字列コードが含まれているかどうかを確認し、ss1 または ss4 の文字列を返すことができます。これは良い考えですか?

4

5 に答える 5

5

最も効率的なアプローチは、ルックアップを超高速で実行できるトランスレータ ハッシュを一度生成することです。

CODES = {
  ss1: ['392', '227', '179', '176'],
  ss2: ['389', '386'],
  ss3: ['371', '338', '335'],
  ss4: ['368', '350', '332', '329', '323', '185', '182']
}

translator = CODES.each_with_object({}){|(s, a), m| a.each{|n| m[n] = s.to_s}}

これで、次のことが簡単にできます。

translator['329']
=> "ss4"
translator['389']
=> "ss2"
于 2013-04-25T14:36:42.067 に答える
1
def code_to_string(code)
  if [395].include? code
    "ss1"
  elsif [392, 227, 179, 176].include? code
    "ss2"
  # and so on
end

コードは整数であることに注意してください。文字列コードと一致させる%w(392 227 179).include?には、配列の代わりに使用します

于 2013-04-25T14:21:34.293 に答える
0

すべての配列を多次元ハッシュに結合してから、それを検索することをお勧めします。

a1 = ['395']
a2 = ['392', '227', '179', '176']

h = { a1: a1, a2: a2 }
h.select {|a, v| a if v.include?('392') }.keys.first.to_s
于 2013-04-25T14:13:45.987 に答える
0

あなたが試すことができる1つの解決策は次のとおりです。

CODE_LOOKUP = {
  [395] => 'ss1',
  [392, 227, 179, 176] => 'ss2',
  [389, 386] => 'ss3'
  # etc
}

def lookup_code(code)
  CODE_LOOKUP.each do |codes_to_test, result|
    return result if codes_to_test.include?(code)
  end
end

lookup_code(395)
# => "ss1"

lookup_code(179)
# => "ss2"
于 2013-04-25T14:19:14.890 に答える