/ / Сортиране на Hash на хешовете по стойност (и връщане на хеша, а не масив) - рубин, структури от данни, хеш, сортиране

Сортиране на Hash of Hashes по стойност (и връщане на хеш, а не масив) - рубин, структури от данни, хеш, сортиране

Имам следния хеш:

user = {
"user" => {
"title" => {"weight" => 1, .... }
"body" => {"weight" => 4, ....}
....
....
}
}

Възможно ли е да се сортира потребителят по клавиша за тегло на хешовете на неговите деца?

Погледнах в Hash.sort, но изглежда, че той връща масив, а не оригиналния ми хеш сортиран.

Отговори:

11 за отговор № 1

В Ruby 1.9, Hashса сортирани, но Hash#sort все още връща Array на Arrayс. Представи си това! Това означава, че можете да изградите свой собствен метод за сортиране отгоре.

class Hash
def sorted_hash(&block)
self.class[sort(&block)]   # Hash[ [[key1, value1], [key2, value2]] ]
end
end

Hashes са несортирани в Ruby 1.8. Ако искате Ruby 1.8 съвместимост, можете да използвате ActiveSupport "s OrderedHash, Той се държи като 1.9-Hash, така че можете да определите същото sorted_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", "..."=>"..."}}

8 за отговор № 2

Хешовете са фундаментално несортирани структури от данни; Hash#sort наистина е това, което искате. Или това, или сортирайте списък с ключове и след това го използвайте за изброяване, когато е време да се изведе хешът, вместо да се изброява директно над хеша, използвайки свои собствени методи.