Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组内的ruby排序哈希_Arrays_Ruby_Sorting_Hash - Fatal编程技术网

Arrays 数组内的ruby排序哈希

Arrays 数组内的ruby排序哈希,arrays,ruby,sorting,hash,Arrays,Ruby,Sorting,Hash,我有一个哈希数组,我想根据:reference值对其进行排序。但是数组中的某些元素没有:reference键,因此无法排序。有没有一种方法可以忽略此字段,只对包含此键的哈希元素进行排序 我尝试了以下方法,但我得到了一个参数错误 ArgumentError: comparison of NilClass with String failed sort_by at org/jruby/RubyEnumerable.java:503 arr1 = [{:reference=> "F12

我有一个哈希数组,我想根据
: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"}
      ]

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

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 ] }

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

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
的哈希,另一个不包含:

with_ref, without_ref = arr1.partition { |h| h[:reference] }
然后对第一个进行排序:

with_ref.sort_by! { |h| h[:reference] }
最后连接两个数组:

arr1 = with_ref + without_ref

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

with_ref, without_ref = arr1.partition { |h| h[:reference] }
然后对第一个进行排序:

with_ref.sort_by! { |h| h[:reference] }
最后连接两个数组:

arr1 = with_ref + without_ref

非常感谢。有没有一种方法可以对数组进行排序,使没有
:reference
键的散列最终位于数组的后面?我添加了一种方法,通过在排序中添加第二个元素来强制它们返回,从而将它们推到最后。数组是一种方便的方法,因为它是根据第一个元素然后第二个元素进行排序的。您不需要在最后一行中使用
。字符串永远不会与
nil
nil nil#=>0
@CarySwoveland这有点偏执,一些疯狂的东西,比如
false
可能会出现在那里,但你基本上是对的,它是无关的。如果
false
在任何情况下都会引发异常,这可能是你想要的。请注意,如果
false
排序依据数组的第一个元素将是
1
,因此您将
false.to_s#=“false”
nil
进行比较,从而引发异常。如果将
放到s
false
将与
nil
进行比较,再次引发异常(这是好的)。因此,
不仅帮不上忙,而且会分散注意力。谢谢。有没有一种方法可以对数组进行排序,使没有
:reference
键的散列最终位于数组的后面?我添加了一种方法,通过在排序中添加第二个元素来强制它们返回,从而将它们推到最后。数组是一种方便的方法,因为它是根据第一个元素然后第二个元素进行排序的。您不需要在最后一行中使用
。字符串永远不会与
nil
nil nil#=>0
@CarySwoveland这有点偏执,一些疯狂的东西,比如
false
可能会出现在那里,但你基本上是对的,它是无关的。如果
false
在任何情况下都会引发异常,这可能是你想要的。请注意,如果
false
排序依据数组的第一个元素将是
1
,因此您将
false.to_s#=“false”
nil
进行比较,从而引发异常。如果将
放到s
false
将与
nil
进行比较,再次引发异常(这是好的)。因此,
不仅对我们没有帮助,而且分散了我们的注意力。