【问题标题】:How to sort hash in ruby according to some custom rules [closed]如何根据一些自定义规则对红宝石中的哈希进行排序[关闭]
【发布时间】:2013-01-03 22:50:38
【问题描述】:

我有一个这样的数组:

["Is", "Gandalf", "The", "Gray", "Insane"]

我想根据数组中键的位置对哈希进行排序。比如我想排序:

{:count=>21, "Is"=>19, "Gandalf"=>1, "Gray"=>0, "Insane"=>1, "The"=>5}

进入这个:

{"Is"=>19, "Gandalf"=>1, "The"=>5, "Gray"=>0, "Insane"=>1, :count=>21}

另一个例子是排序:

{:count=>3, "Is"=>11, "Insane"=>22, "Gray"=>0, "Gandalf"=>12, "The"=>2}

进入这个:

{"Is"=>11, "Gandalf"=>12, "The"=>2, "Gray"=>12, "Insane"=>22, :count=>3}

如何做到这一点?

【问题讨论】:

  • 为什么要对哈希进行排序?哈希是随机访问数据结构,因此对键进行排序纯粹是装饰性的,绝对没有价值或访问速度的提高。换句话说,这是浪费时间。
  • 我不是在寻找性能改进,我正在通过前端的哈希循环并对每个条目做一些事情(条目是问题中的那个哈希)。我需要它每次都以相同的顺序显示
  • 解释前端发生了什么。照原样,您的请求有代码味道,如果您将数据发送到 Web 前端,请使用 JSON 对数据进行编码,将其发送到浏览器,让 JavaScript 将 JSON 解码回哈希,然后访问产生的哈希值正常。
  • @GandalfStormCrow,我的回答不会有帮助吗?这有什么问题?
  • 为什么不直接遍历数组而不是哈希?

标签: ruby hash


【解决方案1】:
class Hash
  def sort_by_array a; Hash[sort_by{|k, _| a.index(k) || length}] end
end

适用于第一个示例:

a = ["Is", "Gandalf", "The", "Gray", "Insane"]

{:count=>21, "Is"=>19, "Gandalf"=>1, "Gray"=>0, "Insane"=>1, "The"=>5}.sort_by_array(a)
# => {"Is"=>19, "Gandalf"=>1, "The"=>5, "Gray"=>0, "Insane"=>1, :count=>21}

但是,它不适用于您的第二个示例,因为您期望第二个示例的结果不仅仅是排序,还需要更改 "Gray" 的值:

{:count=>3, "Is"=>11, "Insane"=>22, "Gray"=>0, "Gandalf"=>12, "The"=>2}.sort_by_array(a)
# => {"Is"=>11, "Gandalf"=>12, "The"=>2, "Gray"=>0, "Insane"=>22, :count=>3}

# You wanted
# => {"Is"=>11, "Gandalf"=>12, "The"=>2, "Gray"=>12, "Insane"=>22, :count=>3}

由于尚不清楚"Gray" 的值12 来自何处,因此无法以满足第二个示例的方式回答您的问题。

【讨论】:

  • class Hash def sort_by_array a; Hash[sort_by{|k, _| a.index(k) || length}] end end 去哪儿了?我把它放在控制器里,它出错了
【解决方案2】:

我建议,通过按您需要的顺序填充数组,将其转换为数组。 然后,您可以通过使用该数组或将该数组转换为 hashmap 来访问该数组本身。

http://x3ro.de/ruby-19-array-hash/

讨论相似行的一个链接是,

How to sort not simple hash (hash of hashes)

【讨论】:

    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2023-03-04
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多