【问题标题】:ruby sorting hashes inside arrayruby 对数组内的哈希进行排序
【发布时间】:2016-10-12 17:35:14
【问题描述】:

我有一个哈希数组,我想根据:reference 值对其进行排序。但是数组中的某些元素没有:reference 键,因此无法排序。有没有办法忽略这个字段,只对包含这个键的哈希元素进行排序?

我尝试了以下方法,但出现参数错误

ArgumentError: comparison of NilClass with String failed
  sort_by at org/jruby/RubyEnumerable.java:503



arr1 = [{:reference=> "F123",
            :name=> "test4"
          },
          {
            :reference=> "ZA4",
            :name=> "test3"
          },
          {
            :reference=> "A43",
            :name=> "test2"
          },
          {
            :name=> "test1"
          },
          {
            :name=> "homework1"
          }]

arr1 = arr1.sort_by { |hash| hash[:reference] }

puts arr1

正确的输出应该是这样的:

=> arr1= [
        {:reference=>"A43", :name=>"test2"},
        {:reference=>"F123", :name=>"test4"},
        {:reference=>"ZA4", :name=>"test3"},
        {:name=> "test1"},
        {:name=> "homework1"}
      ]

【问题讨论】:

    标签: arrays ruby sorting hash


    【解决方案1】:

    您只能对可以比较的值进行排序,因此如果您有不同类型的值,最好先将它们转换为相同类型。一个简单的解决方法是转换为字符串:

    arr1.sort_by { |hash| hash[:reference].to_s }
    

    您也可以指定默认值:

    arr1.sort_by { |hash| hash[:reference] || '' }
    

    编辑:如果您希望nil 值排在最后:

    arr1.sort_by { |hash| [ hash[:reference] ? 0 : 1, hash[:reference].to_s ] }
    

    【讨论】:

    • 谢谢。有没有办法对数组进行排序,以便没有 :reference 键的哈希值最终出现在数组的后面?
    • 我添加了一种方法来将它们推到最后,方法是在它们的排序中添加第二个元素以强制它们返回。数组是一种方便的方法,因为它是根据第一个元素然后第二个元素进行排序的。
    • 最后一行不需要.to_s。字符串永远不会与nilnil <=> nil #=> 0 进行比较。
    • 如果false 无论如何都会引发异常,这可能就是您想要的。请注意,如果falsesort_by 数组的第一个元素将是1,那么您将比较false.to_s #=> "false"nil,从而引发异常。如果删除to_sfalse 将与nil 进行比较,再次引发异常(这很好)。所以to_s 不仅没有帮助,而且会分散注意力。
    【解决方案2】:

    如果您不介意临时变量,您可以将数组拆分为两个数组,一个包含带有:reference 的哈希值,另一个包含没有:

    with_ref, without_ref = arr1.partition { |h| h[:reference] }
    

    然后对第一个进行排序:

    with_ref.sort_by! { |h| h[:reference] }
    

    最后连接两个数组:

    arr1 = with_ref + without_ref
    

    【讨论】:

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