Рубин Сортировать по нескольким значениям?


у меня есть массив хэшей:

a=[{ 'foo'=>0,'bar'=>1 },
   { 'foo'=>0,'bar'=>2 },
   ... ]

Я хочу отсортировать массив сначала по каждому хэшу 'foo', а затем по'bar'. Google говорит мне, что это так:

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

но это дает мне аргумент "сравнение массива с массивом не удалось". Что это значит?

5 57

5 ответов:

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

вероятно, это означает, что вам не хватает одного из полей " foo " или " bar " в одном из ваших объектов.

сравнение сводится к чему-то вроде nil <=> 2, который возвращает nil (вместо -1,0 или 1) и #sort_by не знает, как обращаться nil.

попробуйте это:

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

то, что вы опубликовали работает в 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'=>99,'bar'=>1},{'foo'=>0,'bar'=>2, 'qwe' => 7}]
a.sort_by{|v| v['qwe']}
ArgumentError: comparison of NilClass with 7 failed

попробуй сделать

a.sort_by{|v| [v['qwe']].select{|k| not k.nil?}}

но это не работает для меня

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

где цифра нестабильная