2

Hash2のキーをHash1の値の順に並べ替えたいと思います。Hash2には、Hash1のすべての値が含まれている必要はありません。Hash1には、Hash2のすべてのキーが含まれている必要はありません。Hash1に対応する値がないキーがHash2に存在する場合は、既存の順序付けされたキーの下に順序付けする必要があります。

Hash1 = {
    p0: "q11",
    p1: "q55",
    p2: "q92",
    p3: "q77"

}

Hash2 = {
    q55: {...},
    q23: {...},
    q59: {...},
    q98: {...},
    q11: {...}
}

=>
DesiredHash = {
    q11: {...},
    q55: {...},
    q23: {...},
    q59: {...},       
    q98: {...} 
}

これを達成するための最もRubyっぽい方法は何ですか?

4

3 に答える 3

3

@sawa と似ていますが、Hash#values を使用すると、実際にクリーンアップされます:

keys = Hash1.values.map &:to_sym
Hash[Hash2.sort_by{|k, v| keys.index(k) || keys.length}]
于 2012-10-19T08:28:06.980 に答える
2
array = Hash1.map{|k, v| [k, v.to_sym]}
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v} || array.length}]

または、おそらく効率は低くなりますが、より短くなります。

array = Hash1.to_a
Hash[Hash2.sort_by{|k, _| array.index{|_, v| k == v.to_s} || array.length}]

説明(2番目のものを使用) Hash1を参照として使用します。つまり、その「インデックス」で何かをしたいということです。ハッシュにはインデックスの概念がないため、array. to_aそれをします。次に、のキーがの「値」と一致するように のインデックス順に並べ替えますHash2(キーと値のペアを含む配列に暗黙的に変換されることを意味します) 。そのようなインデックスを検索します。一致しない場合は、 のどのインデックスよりも大きい が割り当てられます。最後に、そのキーと値のペアをハッシュに戻します。それはによって行われます。arrayHash2arrayindex{...}array.lengtharrayHash[...]

于 2012-10-19T03:00:54.927 に答える
1
hash1 = {
    p0: "q11",
    p1: "q55",
    p2: "q92",
    p3: "q77"

}

hash2 = {
    q55: 1,
    q23: 2,
    q59: 3,
    q98: 4,
    q11: 5
}

def get_key(hash, value)
  hash.each { |k, v| return k if v == value }
  return hash.keys.max
end

Hash[hash2.sort_by { |a, _| get_key(hash1, a.to_s) }]
#=> {:q11=>5, :q55=>1, :q23=>2, :q98=>4, :q59=>3}
于 2012-10-19T03:07:15.250 に答える