Ответ 1
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }
У меня есть массив хэшей:
a=[{ 'foo'=>0,'bar'=>1 },
{ 'foo'=>0,'bar'=>2 },
... ]
Я хочу сначала отсортировать массив по каждому хэшу "foo", затем по "bar". Google сообщает мне, как это делается:
a.sort_by {|h| [ h['foo'],h['bar'] ]}
Но это дает мне аргумент ArgumentError "Сравнение массива с массивом". Что это значит?
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}]
Это исключение возникает, когда массив результатов, используемый для сравнения, содержит значения nil и non-nil.
Эта ошибка появляется, когда у вас есть неустойчивые клавиши и пытается их сортировать. Пример:
[{'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']]
где цифра нестабильна
Не удалось сравнить Array с Array
Это означает (по крайней мере, в моем случае), что типы элементов массива различны. Когда я убедился, что все элементы массива имеют одно и то же время (например, Integer
), сортировка начала работать.