Подтвердить что ты не робот

Ruby сортировать по нескольким значениям?

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Попробуйте следующее:

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

Ответ 3

Что вы опубликовали в 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}] 

Ответ 4

Это исключение возникает, когда массив результатов, используемый для сравнения, содержит значения nil и non-nil.

Ответ 5

Эта ошибка появляется, когда у вас есть неустойчивые клавиши и пытается их сортировать. Пример:

[{'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']]

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

Ответ 6

Не удалось сравнить Array с Array

Это означает (по крайней мере, в моем случае), что типы элементов массива различны. Когда я убедился, что все элементы массива имеют одно и то же время (например, Integer), сортировка начала работать.