5

そのため、知識はあまりありませんがRuby、簡単なスクリプトを作成する必要があります。私のジレンマを詳細に説明しようとしますが、まだ説明が必要な場合はお知らせください.

私のスクリプトには、それぞれ 3 つの数字のセットが含まれています。たとえば、各人について次の 3 つの情報があるとしますAge, Size, and Score。したがって、特定の年齢とサイズの人が存在するかどうかを評価する方法が必要です。もしそうなら、その人のスコアを出力したいと思います。

私が知っているこの情報を追跡する唯一の方法は、 を作成し3 separate arrays、それぞれにinformation. 年齢が 1 つの配列に含まれているかどうかを確認できます。含まれている場合は、そのインデックスを見つけることができます (各カテゴリの各値は一意になるため、「年齢」、「サイズ」、または「スコア」は繰り返されません)。次に、サイズ配列の同じインデックスの値が指定されたサイズと一致するかどうかを確認できます。もしそうなら、同じインデックスで 3 番目の配列内にあるスコアを出力できます。私はこの方法ではなく、各人のagesize、およびscoreを一緒に保つことを好みます。

したがって、次のような配列内で配列を試しました。

testarray = [
  [27, 8, 92],
  [52, 12, 84]
]

ただし、これの問題は、これらのサブ配列内の値にアクセスする方法がわからないことです。したがって、testarray.include?(27) のようなものを使用してメイン配列内に 27 が存在するかどうかを確認できることはわかっていますが、27 と 8 が testarray のサブ配列内の最初の 2 つの値であるかどうかを確認するにはどうすればよいでしょうか。次にsubarray、92の 3 番目の値を出力します。

次に、以下のようにハッシュの配列を試しました。

testarrayb = [
{ :age => 27, :size => 8, :score => 92 },
{ :age => 52, :size => 12, :score => 84 }
]

を使用testarrayb[0][:score]して 92 を取得できることはわかっていますが、指定された年齢とサイズの両方を持つハッシュが配列に含まれているかどうかを最初に確認し、含まれている場合はそのハッシュのスコアを出力するにはどうすればよいでしょうか? testarrayb[:age].include?(value)各ハッシュの年齢がチェックされ、同じハッシュのサイズがチェックされる場所に似ています。両方が指定された値と一致する場合、そのハッシュのスコアが出力されます。

誰かが私を正しい方向に向けることができれば、非常に感謝しています。それがあなたが推奨するものである場合は、より効率的で完全に異なる手法を自由に示してください。御時間ありがとうございます!

4

6 に答える 6

1

あなたの要件から私が知ることができることから( 「特定の年齢とサイズの人が存在するかどうかを評価する方法が必要です」「指定された年齢とサイズの両方を持つハッシュが配列に含まれているかどうかを最初に確認するにはどうすればよいですか? " ) では、常に年齢とサイズのペアで人を識別し、そのペアに基づくスコアをキーとして参照したいと考えています。Ruby では任意のタイプのオブジェクトをハッシュのキー (または値) として使用できるため、それを直接変換できます。

# `scores` hash is structured { [age, size] => score, ... }
scores = {[27, 8] => 92, [52, 12] => 84}

特定の年齢とサイズのペアを持つ人が存在するかどうかを尋ねることができます。

scores.include?([27, 8])  # => true
scores.include?([27, 7])  # => false
scores.include?([28, 8])  # => false
scores.include?([52, 12]) # => true

そして、人に新しいスコアを割り当てることができます (ここでも、年齢/サイズのペアで識別されます)。

scores[[52, 12]] = 97
scores                    # => {[27, 8]=>92, [52, 12]=>97}

またはもちろん、値にアクセスしたいので、いつでもnilafterをテストできます。

score = scores[[27, 8]]   # `score` is now `92`
if !score.nil?
  # Do something with `score`
end

私はペアを表すために配列を使用することを好みますが、別のオプションはハッシュを使用することです。これにより、明確にするために要素に名前を付けることができ、順序を気にする必要がなくなります。

scores = {{:age => 27, :size => 8} => 92, {:age => 52, :size => 12} => 84}
scores[{:size => 8, :age => 27}] # => 92
于 2013-04-15T16:48:47.037 に答える
1

ハッシュのハッシュはあなたのためにトリックをしますか?

testhash = {27 => {8 => 92}, 52 => {12 => 84}}
p testhash             # {27=>{8=>92}, 52=>{12=>84}}
p testhash[27][8]      # 92
p testhash[27][42]     # nil
testhash[27][42] = 99
p testhash             # {27=>{8=>92, 42=>99}, 52=>{12=>84}}
p testhash[27][42]     # 99

年齢とサイズのペアが一意である限り、これは非常に効率的です。

于 2013-04-15T15:09:02.703 に答える
0
def person_score (*input)
    testarray = [
    [27, 8, 92],
    [52, 12, 84]
    ]
        testarray.each_with_object("") do|i,mem| 
            h = Hash[*([:age,:size,:score].zip(i).flatten)]
            (h.values.first(2) == input) ? (return h[:score]) : ( mem.replace("age and size not matched"))
        end
end

p person_score(27,12)  #=> "age and size not matched" 
p person_score(27,8)   #=> 92
p person_score(52,44)  #=> "age and size not matched"
p person_score(52,12)  #=> 84
于 2013-04-15T14:04:48.657 に答える
0

おそらく次のようなことができます:

[
  { age: 27, size: 8,  score: 92 },
  { age: 52, size: 12, score: 84 }
].map { |e| e[:age] == 27 && e[:size] == 8 ? e[:score] : nil }.compact

maparrayブロックの結果で新しいを返します(e[:score]条件が一致するかnilどうかを示します。compactその後nil、結果のarray.

しかし、この動作は独自のクラスに適しているように思えます。なぜなら、今示したものには多くのハードコーディングされたもの (特にエントリを選択する条件) が含まれているため、これは悪いことです。たぶん、これに適したクラスを見つけようとしますか?

于 2013-04-15T13:31:25.503 に答える