Сортировка Хеша Хешей значением (и возврат хеш, не массив)

  1. Проверьте границы
  2. Проверьте границы,

    и, конечно,

  3. Проверьте границы.

И если вы забыли одно из этих правил, используйте Valgrind. Это относится к массивам, строкам и указателям, но на самом деле очень легко забыть о том, что вы действительно делаете, когда делаете выделения и арифметику памяти.

11
задан Jim Puls 11 June 2009 в 20:32
поделиться

2 ответа

В Ruby 1.9 хеш es сортируются, но Hash # sort по-прежнему возвращает массив из Array с. Представьте себе, что! Это означает, что вы можете создать на его основе свой собственный метод сортировки.

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

Хеш es не отсортированы в Ruby 1.8. Если вам нужна совместимость с Ruby 1.8, вы можете использовать ActiveSupport 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", "..."=>"..."}}
11
ответ дан 3 December 2019 в 06:22
поделиться

Хеши - это в основном несортированные структуры данных; Hash # sort - это действительно то, что вам нужно. Либо так, либо отсортируйте список ключей, а затем используйте его для перечисления, когда пришло время вывести хеш, вместо прямого перечисления по хешу с использованием собственных методов.

8
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: