Ruby按多个值排序?

Ruby按多个值排序?,ruby,Ruby,我有一个哈希数组: a=[{ 'foo'=>0,'bar'=>1 }, { 'foo'=>0,'bar'=>2 }, ... ] 我想先按每个散列的'foo',然后按'bar'对数组进行排序。谷歌告诉我这是怎么做到的: a.sort_by {|h| [ h['foo'],h['bar'] ]} 但这给了我一个ArgumentError“数组与数组的比较失败”。这是什么意思?a.sort{a,b |[a['foo',a['bar']][b['foo',b['

我有一个哈希数组:

a=[{ 'foo'=>0,'bar'=>1 },
   { 'foo'=>0,'bar'=>2 },
   ... ]
我想先按每个散列的'foo',然后按'bar'对数组进行排序。谷歌告诉我这是怎么做到的:

a.sort_by {|h| [ h['foo'],h['bar'] ]}
但这给了我一个ArgumentError“数组与数组的比较失败”。这是什么意思?

a.sort{a,b |[a['foo',a['bar']][b['foo',b['bar']}
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }

您发布的内容在Ruby 1.8.7中有效:

ruby-1.8.7-p302 > a = [{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2}]
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['foo'],h['bar']] }
 => [{"foo"=>0, "bar"=>2}, {"foo"=>99, "bar"=>1}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['bar'],h['foo']] }
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 

这可能意味着您在某个对象中缺少一个字段“foo”或“bar”

比较可以归结为
nil2
,它返回
nil
(而不是
-1
0
1
)和
#sort\u by
不知道如何处理
nil

试试这个:

a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}

当您有不稳定的键并试图按它们排序时,会出现此错误。 例如:

尽力

a.sort_by{|v| [v['qwe']].select{|k| not k.nil?}}
但这对我来说不起作用

[v['index'],v['count'],v['digit'],v['value']]

如果数字不稳定

当用于比较的结果数组同时包含nil和非nil值时,会发生此异常

将数组与数组进行比较失败


这意味着(至少在我的例子中)数组元素的类型是不同的。当我确保所有数组项都在同一时间(例如,
Integer
)时,排序开始工作。

考虑压缩数组(删除nil项),另外,如果是字符串比较,请将不区分大小写排序的值降为大小写

a.compact.sort_by { |h| [h['foo'].downcase, h['bar'].downcase] }

对我有用。您使用的是旧版本的ruby吗?您发布的内容适用于1.8.7。您认为您拥有的数据和实际拥有的数据是否可能不相同?当用于比较的结果数组同时包含nil和non-nil值时,会出现此异常。另外请注意,ruby无法比较布尔值,这也可能导致这个错误。这是同样的事情
Enumerable#sort_by(&block)
大致是
sort{a,b | block.call(a)block.call(b)}
,除非以更有效的方式完成。如果这样做有效,但排序依据不起作用,那么就有其他问题了。对于简单键,排序更有效。对于复杂的键,排序更有效。嗯,现在我得到了“当你没有预料到它时,你有一个nil对象!”错误。我所使用的确切阵列是
a
a0,'BarBar'=>2},{foo'=>0,'bar'=>1},{foo'=>0,'Boo'=>0,'bar'=>0,'Boo'=>0,'BarBar'=>2},{foo'foo'=>0,,'Boo''bar'=>1},<我所使用的确切数组我所使用的确切阵列是0''=>0'=>0,=>0,=>0,'foo'=>0,'foo'=>0,=>0,=>0,=>0,=>0,=>0,'''{“foo”=>0,“bar”=>1},{“foo”=>2,“bar”=>1},{“foo”=>1,“bar”=>0}]>>a.sort{a,b |[a['foo'],a['bar'][b['foo'],b['bar']}=>[{“foo”=>0,“bar”=>1},{“foo”=>0,“bar”=>2},{“foo”=>1,“bar”=>0},{“foo”=>2,“bar”=>1}]排序的一个优点是比较干燥。
a.compact.sort_by { |h| [h['foo'].downcase, h['bar'].downcase] }