Можно ли сделать условную сортировку в хеше? - PullRequest
4 голосов
/ 04 августа 2010

Можно ли сделать условную сортировку в хэше?

Мой хеш будет таким:

{1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60",7=>"70",8=>"80",9=>"90"}

Желаемый результат:

{7=>"70",8=>"80",9=>"90",1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60"}

добавить условие в этот код

operation_hour_hash.sort{|key,value| key[1]<=>value[1]}

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Конечно, вы можете сделать что-то вроде:

>> {1=>"10",2=>"20",3=>"30",4=>"40",5=>"50",6=>"60",7=>"70",8=>"80",9=>"90"}.sort{|p,n| (p[1].to_i>=70 && n[1].to_i<70) ? -1 : (p[1].to_i<70 && n[1].to_i>=70) ? 1 : p[1].to_i <=> n[1].to_i}

=> [[7, "70"], [8, "80"], [9, "90"], [1, "10"], [2, "20"], [3, "30"], [4, "40"], [5, "50"], [6, "60"]]

Но сортировка хешей не имеет особого смысла.Перед тем как сортировка фактически произойдет, она преобразуется в массив пар [ключ, значение], затем сортируется по -1,0,1, возвращаемому из <=>.

Если вам нужны отсортированные хэши, вам нужно использоватьчто-то вроде Словарь RubyFacets класс.

1 голос
/ 04 августа 2010

Вы можете попробовать что-то вроде этого, чтобы создать отсортированный массив

operation_hour_hash.sort {|x,y| (x[0]>6?x[0]-6:x[0]+24)<=>(y[0]>6?y[0]-6:y[0]+24)}
>>  [[7, "70"], [8, "80"], [9, "90"], [1, "10"], [2, "20"], [3, "30"], [4, "40"], [5, "50"], [6, "60"]]

Вы можете изменить условия в соответствии со своими потребностями.

Однако будьте осторожны, что в ruby ​​1.8 хешне заказан ключом.Если вы преобразуете обратно в хэш, порядок не гарантируется.

1 голос
/ 04 августа 2010

Ваш сортировочный вызов вводит в заблуждение. Вы не сравниваете ключ и значение, вы сравниваете два разных элемента массива. Так и должно быть:

operation_hour_hash.sort{|a,b| a[1]<=>b[1]}

Вы можете реализовать любую логику, какую захотите, в блоке сортировки, если она придерживается следующего:

Блок реализует сравнение между a и b, возвращая -1, 0 или + 1

(взято из: http://ruby -doc.org / core / classes / Array.html # M002185 )

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