3

次のルビーハッシュを提供しました。

{
    cat: {
        1: 2,
        2: 10,
        3: 11,
        4: 1
    },
    wings: {
        1: 3,
        2: 5,
        3: 7,
        4: 7
    },
    grimace: {
        1: 4,
        2: 5,
        3: 5,
        4: 1
    },
    stubborn: {
        1: 5,
        2: 3,
        3: 7,
        4: 5
    }
}

「4」を除く「leaf」の合計でハッシュを並べ替えるにはどうすればよいですか。たとえば、「cat」の比較値は(2 + 10 + 11)= 23、「wings」の値は(3 + 5 + 7)= 15なので、これら2つだけを比較すると、正しい順序になり、合計が最も高くなります。

これらは私が定義した定数のキーであるため、常に{1:値、2:値、3:値、4:値}になると想定しても問題ありません。

また、キー「4」のみを除外し、常にキー「1」、「2」、および「3」を使用したいと考えるのも安全です。

ジョーダンの提案に基づいて、私はこれを機能させました:

  tag_hash = tag_hash.sort_by do |h| 
    h[1].inject(0) do |sum, n| 
      n[0] == 4 ? sum : sum + (n[1] || 0)
    end
  end

結果は少しずれているように見えますが、それは私のコードのようです。答えを受け入れることを確認したら、Jordanに感謝します。

ウェインコンラッドのアイデアを使用するようにソリューションを更新しました。彼の回答に対するコメントを参照してください-並べ替え時にすべてが含まれていない可能性はありますか?コメント内の画像にリンクして、実際の並べ替えの結果をグラフ形式で示しています..私には奇妙に思えます..

4

4 に答える 4

8
tag_hash = tag_hash.sort_by do |_, leaf|
  leaf.reject do |key, _|
    key == 4
  end.collect(&:last).inject(:+)
end
于 2010-04-20T05:12:14.827 に答える
2
my_hash.sort_by do |_, h|
  h.inject(0) do |sum, n|
    # only add to the sum if the key isn't '4'
    n[0] == 4 ? sum : (sum + n[1])
  end
end

もちろん、これは恐ろしく読めないワンライナーに短縮することができます。

my_hash.sort_by {|k,h| h.inject(0) {|sum,n| n[0] == 4 ? sum : (sum + n[1]) } }
于 2010-04-20T02:32:47.410 に答える
0

これ

puts a.sort_by { |k, v| -v.values[0..-1].inject(&:+) }

次の出力を生成しますが、これはあなたが望んでいたものでしたか?

cat
{1=>2, 2=>10, 3=>11, 4=>1}
wings
{1=>3, 2=>5, 3=>7, 4=>7}
stubborn
{1=>5, 2=>3, 3=>7, 4=>5}
grimace
{1=>4, 2=>5, 3=>5, 4=>1}
于 2010-04-20T06:48:53.323 に答える
0

これはうまくいくようです:

x.sort_by{ |_,h| h.values.take(3).inject(:+) }

これは、サブハッシュがソートされていることを前提としています(最初の3つのエントリは、合計するエントリです)。

ActiveSupportを使用すると、次のことができます。

x.sort_by{ |_,h| h.values.take(3).sum }

また

x.sort_by{ |_,h| h.slice(1,2,3).values.sum }

Hash#sliceは、sliceに渡されたキーのみを含むハッシュを返します。Array#takeは、ソース配列の最初のn個のエントリを含む配列を返します。

(Ruby 1.9.1が必要だと思います)

于 2010-04-24T15:44:53.017 に答える