Ruby сортировать по нескольким значениям? - PullRequest
62 голосов
/ 30 ноября 2010

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

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

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

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

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

Ответы [ 6 ]

64 голосов
/ 30 ноября 2010
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }
18 голосов
/ 07 марта 2014

Это, вероятно, означает, что вы пропускаете одно из полей 'foo' или 'bar' в одном из ваших объектов.

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

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

a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}
12 голосов
/ 30 ноября 2010

Какие вы разместили работы в 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}] 
3 голосов
/ 21 июля 2016

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

0 голосов
/ 20 декабря 2018

сравнение массива с массивом не удалось

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

0 голосов
/ 01 июля 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...