/ / Sortowanie skrótu według wartości (i zwraca skrót, a nie tablicę) - ruby, struktury danych, skrót, sortowanie

Sortowanie skrótu hashe według wartości (i zwracanie skrótu, a nie tablicy) - ruby, struktury danych, hash, sortowanie

Mam następujący skrót:

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

Czy można posortować użytkownika według klucza wagi jego skrótów potomnych?

Zajrzałem do Hash.sort, ale wygląda na to, że zwraca tablicę, a nie mój posortowany skrót.

Odpowiedzi:

11 dla odpowiedzi nr 1

W Ruby 1.9 Hashsą posortowane, ale Hash#sort wciąż zwraca Array z Arrays. Wyobraź sobie, że! Oznacza to, że możesz na nim zbudować własną metodę sortowania.

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

Hashsą nieposortowane w Ruby 1.8. Jeśli chcesz kompatybilność z Ruby 1.8, możesz skorzystać z ActiveSupport OrderedHash. Zachowuje się jak 1.9Hash, dzięki czemu możesz zdefiniować to samo sorted_hash metoda na nim:

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!

Musisz skopiować sorted_hash do kodu, ponieważ domyślnie nie istnieje!

Aktualizacja do głębokiego sortowania: Jeśli chcesz posortować coś innego niż klucz skrótu, przekaż blok do sorted_hash następująca metoda (przy założeniu implementacji z góry):

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 dla odpowiedzi № 2

Hashe to zasadniczo nieposortowane struktury danych; Hash#sort jest rzeczywiście tym, czego chcesz. Albo to, albo posortuj listę kluczy, a następnie użyj tego do wyliczenia, kiedy nadejdzie czas na wygenerowanie skrótu, zamiast wyliczania bezpośrednio nad skrótem przy użyciu jego własnych metod.