ruby - 如何按键按字母顺序对 Ruby 哈希进行排序

标签 ruby sorting

我正在尝试按键按字母顺序对哈希进行排序,但如果不创建我自己的排序类,我似乎无法找到一种方法来做到这一点。如果它是一个整数,我发现下面的代码按值排序,我试图修改它但没有任何运气。

temp["ninjas"]=36
temp["pirates"]=12
temp["cheese"]=222
temp.sort_by { |key, val| key }

我的目标是按键排序哈希,然后输出值。我将不得不使用不同的哈希顺序但相同的值多次执行此操作。

最佳答案

假设您希望输出是一个散列,它将按排序顺序遍历键,那么您就快完成了。 Hash#sort_by 返回一个ArrayArray,内部数组都是两个元素。

Ruby 的 Hash 有一个可以使用此输出的构造函数。

试试这个:

temp = Hash[ temp.sort_by { |key, val| key } ]

或更简洁

temp = temp.sort_by { |key| key }.to_h

如果您的散列具有混合键类型,这将不起作用(例如,Ruby 不会自动在 StringSymbol 之间排序)并且您会收到错误消息类似符号与字符串的比较失败 (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/

相关文章:

ruby-on-rails - 在 Rails 中实现 k-d 树 - 需要帮助才能开始

ruby - 覆盖反引号

ruby - <=> 如何适用于不同的排序策略?

python - Python 中的二分查找 : correct slicing

ruby - 我可以在不坚持的情况下删除 Mongoid 中的嵌入式文档吗?

ruby - 为什么 open ('uri' ).read 会删除响应数据?

java - 如何在 Java 中对 ArrayList 中的某些项目进行排序?

sorting - 无键比较排序算法

c++ - 数组向后排序?

python - QuickSort with Pivot Function 问题?