Предполагая, что вы хотите, чтобы выход был хешем, который будет перебирать ключи в отсортированном порядке, тогда вы почти находитесь. Hash#sort_by
возвращает Array
Array
s, а внутренние массивы - все два элемента.
У Ruby's Hash
есть конструктор, который может потреблять этот выход.
Попробуйте это:
temp = Hash[ temp.sort_by { |key, val| key } ]
Если ваш хэш перепутал ключевых типов, это не будет работать (Ruby не будет автоматически сортировать между String
s и Symbol
s к примеру), и вы получите сообщение об ошибке, как сравнение Symbol с String не удалось (ArgumentError). Если это так, вы можете изменить приведенное выше значение на
temp = Hash[ temp.sort_by { |key, val| key.to_s } ]
, чтобы обойти проблему. Однако следует предупредить, что ключи по-прежнему сохраняют свои исходные типы, которые могут вызвать проблемы с допущениями в более позднем коде. Кроме того, большинство встроенных классов поддерживают метод .to_s
, поэтому вы можете получить от него нежелательные результаты (например, неожиданный порядок сортировки для цифровых клавиш или других неожиданных типов).
Вы могли бы, в дополнение, конвертировать ключи Strings
с чем-то вроде этого:
temp = Hash[ temp.map { |key, val| [key.to_s, val] }.sort ]
. , , хотя этот подход потеряет информацию о типе исходного ключа, что делает невозможным надежное обращение к исходным данным.
код, как представляется, сделать то, что вы просили. Не могли бы вы отредактировать вопрос, чтобы включить ожидаемый результат? –
Я сделал предположение, что вы хотите, чтобы ваш вывод был другим хэшем. Было бы хорошо видеть, что в вопросе, если это так (тогда вопрос и ответ совпадут). –
Что вы хотите в качестве вывода? Хэши на самом деле не отсортированы (они, по порядку вставки, с Ruby 1.9+). Что конкретно вы пытаетесь сделать? –