我正在尝试按键按字母顺序对哈希进行排序,但如果不创建我自己的排序类,我似乎无法找到一种方法来做到这一点。如果它是一个整数,我发现下面的代码按值排序,我试图修改它但没有任何运气。
temp["ninjas"]=36
temp["pirates"]=12
temp["cheese"]=222
temp.sort_by { |key, val| key }
我的目标是按键排序哈希,然后输出值。我将不得不使用不同的哈希顺序但相同的值多次执行此操作。
最佳答案
假设您希望输出是一个散列,它将按排序顺序遍历键,那么您就快完成了。 Hash#sort_by
返回一个Array
的Array
,内部数组都是两个元素。
Ruby 的 Hash
有一个可以使用此输出的构造函数。
试试这个:
temp = Hash[ temp.sort_by { |key, val| key } ]
或更简洁
temp = temp.sort_by { |key| key }.to_h
如果您的散列具有混合键类型,这将不起作用(例如,Ruby 不会自动在 String
和 Symbol
之间排序)并且您会收到错误消息类似符号与字符串的比较失败 (ArgumentError) 的消息。如果是这样,您可以将上面的内容更改为
temp = Hash[ temp.sort_by { |key, val| key.to_s } ]
解决这个问题。但是请注意,键仍将保留其原始类型,这可能会导致以后代码中的假设出现问题。此外,大多数内置类都支持 .to_s
方法,因此您可能会从中得到不需要的结果(例如数字键的意外排序顺序或其他意外类型)。
另外,您可以使用类似这样的方法将键转换为字符串
:
temp = Hash[ temp.map { |key, val| [key.to_s, val] }.sort ]
. . .尽管这种方法会丢失有关原始 key 类型的信息,从而无法可靠地返回原始数据。
关于ruby - 如何按键按字母顺序对 Ruby 哈希进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384967/