2009-06-11 23 views

答えて

11

Ruby 1.9では、がソートされていますが、Hash#sortはまだArrayArrayを返します。想像してみろ!それはあなたがそれの上に独自のソート方法を構築できることを意味します。

Hash Ruby 1.8ではソートされていません。 Ruby 1.8との互換性が必要な場合は、ActiveSupportのOrderedHashを使用できます。あなたはそれに同じsorted_hashメソッドを定義することができますので、それは、1.9- Hashように振る舞う:

class ActiveSupport::OrderedHash 
    def sorted_hash(&block) 
    self.class[sort(&block)] 
    end 
end 

hash = ActiveSupport::OrderedHash.new 
hash["b"] = "b" 
hash["a"] = "a" 
hash    #=> {"b"=>"b", "a"=>"a"} => unsorted 
hash.sorted_hash #=> {"a"=>"a", "b"=>"b"} => sorted! 

それはデフォルトでは存在しないので、あなたは、あなたのコードにsorted_hash方法をコピーする必要があります!

深いソートの更新: あなたはハッシュキー以外のものに並べ替えるために探している場合は、次のようにsorted_hashメソッドにブロックを渡す(上から実装を想定):

hash = ActiveSupport::OrderedHash.new 
hash["a"] = { "attr" => "2", "..." => "..." } 
hash["b"] = { "attr" => "1", "..." => "..." } 

# Unsorted. 
hash 
    #=> {"a"=>{"attr"=>"2", "..."=>"..."}, "b"=>{"attr"=>"1", "..."=>"..."}} 

# Sort on the "attr" key. (Assuming every value is a Hash itself!) 
hash.sorted_hash { |a, b| a[1]["attr"] <=> b[1]["attr"] } 
    #=> {"b"=>{"attr"=>"1", "..."=>"..."}, "a"=>{"attr"=>"2", "..."=>"..."}} 
+0

私はあなたを得ませんでした。私はレール2.3.2のOrderedHashソースコードを調べました。ソート方法に関しては何も表示されません。 – Dharam

+0

@satynos:私は少しうまくいけばそれを明確にした。自分でsorted_hashを定義する必要がありますが、本当に簡単です!必要に応じて実装をコピーしてください。 – molf

+0

@molf:excellent ...フィードバックと実装のお手伝いをいただきありがとうございます。また、私はハッシュクラスであなたのメソッドを実装する場合、それは動作しますか? ActiveSupport :: OrderedHashで実装する必要がありますか? – Dharam

8

ハッシュは基本的にはソートされていないデータ構造です。 Hash#sortは、確かにあなたが望むものです。どちらか、またはキーのリストをソートし、それを使用して、ハッシュを直接出力するのではなく、独自のメソッドを使用して、ハッシュを出力するときに列挙します。

+3

技術的には、ハッシュはRuby 1.9で注文されます。しかし、私はまだ並べ替えなどのサポートが存在しないので、そうではないかのように扱う方が一般的には良いと思います。 – Chuck

+0

ジム、私に例を挙げてもらえますか? – Dharam

+0

"技術的に、ハッシュはRuby 1.9で注文されています..."これは私を非常に悲しくします。ハッシュは暗黙の順序を持​​たないはずです!確かに、私は時々注文したいと思っています...しかし、そのデータ構造のための別の名前を作成! Grr。 – Beska

関連する問題