【问题标题】:Sort hash with nil key and array values使用 nil 键和数组值对哈希进行排序
【发布时间】:2015-02-12 09:05:27
【问题描述】:

我有一个这样的哈希(它是 group_by 方法的结果):

{nil => [#<ActiveRecord id ..., ...], #<ActiveRecord ...> => [#<ActiveRecord id ..., ...], ...}

我需要对其进行排序,以便 nil 元素成为第一个,然后是所有其他 ActiveRecord 对象。我怎样才能做到这一点? 谢谢

附言

  1. 是的,我需要一个 ActiveRecord 对象作为键(不是符号或其他)
  2. 由于复杂的 SQL 请求,我无法在数据库中执行订单。

我只需要通过键对哈希进行排序。

【问题讨论】:

  • 以下是有关如何改进此问题的建议。我提供它们主要是为了帮助您将来编写问题。 1)当你给出一个例子时,让它完整并给对象命名。 2)使示例尽可能小和简单。在这里,哈希中的大多数对象都是实例这一事实与问题无关,因此请使它们更简单(且可排序),以便读者可以在测试和比较代码时使用它。在这里你可能会使用字符串。 (续)
  • (续) 3. 当你举一个例子时,总是给出你想要的输出。所以这里可能是hash = { nil=&gt; ["dog", "cat"], "pig"=&gt;["zebra", "sloth"], "groundhog"=&gt;["toad", "ladybug"] } 之类的东西(尽管我没有仔细阅读你的问题,不知道这是否有意义)。我在您对@Stefan 的回答的评论中看到您正在对ActiveRecord 对象的字符串表示进行排序。我不认为那些回答的人希望你这样做,因为这样的对象不会响应&lt;=&gt;

标签: ruby-on-rails ruby sorting hash


【解决方案1】:

您无法对哈希进行排序,but

哈希按照插入相应键的顺序枚举它们的值。

要在开头获取特定密钥,请确保先插入它。这是一个例子:

array = [Integer, Range, BasicObject]

hash = array.group_by(&:superclass)
#=> {Numeric=>[Integer], Object=>[Range], nil=>[BasicObject]}

要首先获取nil,请使用nil 键和merge! 新值创建一个哈希:

hash = {nil => nil}
hash.merge!(array.group_by(&:superclass))
#=> {nil=>[BasicObject], Numeric=>[Integer], Object=>[Range]}

【讨论】:

  • 我需要通过ActiveRecord 关联对我的元素进行分组。而且我不知道我的group_by 结果的第一个键还是最后一个键。现在我正在做这样的事情:sort_by { |i, _| i.to_s } 它可以工作,但它是一个棘手的黑客
【解决方案2】:

假设你的哈希值在h:

Hash[h.sort { |a,b| 
  NilClass === a.first ? 
      (NilClass === b.first ? 0 : -1) : 
      (NilClass === b.first ? 1 : a.first <=> b.first) 
}]

这里我们明确定义了sort 函数,它将nils 放在前面,然后通过键对其他元素进行本地排序(在您的情况下为ActiveRecord 实例。)

旁注:您始终可以在数据库中进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2011-07-31
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多