Сортировка Ruby Arrays - не удалось с помощью TypeError: невозможно преобразовать Symbol в Integer - PullRequest
2 голосов
/ 16 апреля 2011

Я пытаюсь отсортировать массив, содержащий хэши.Массив выглядит примерно так:

[:amazon, [{:price=>"  396 ", :author=>"Motwani", :name=>"Randomized Algorithms ", :url=>"", :source=>"amazon"}, 
           {:price=>"  255 ", :author=>"Thomas H. Cormen", :name=>"Introduction To Algorithms ", :url=>"", :source=>"amazon"}]]

Я пытаюсь отсортировать этот массив, используя:

source_array.sort_by { |p| p[1][:price] }

Но я продолжаю получать сообщение об ошибке:

failed with TypeError: can't convert Symbol into Integer

Неуверен, что индексация идет не так

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Вы пытаетесь отсортировать массив из двух элементов:

  • хэш: амазонка,
  • внутренний большой массив.

Итак, любой вызов сортировки в верхнем массиве попытается отсортировать эти два элемента.

Чего вы пытаетесь достичь можно сделать следующим образом:

a[1] = a[1].sort_by {|f| f[:price].to_i}

Редактировать: для более общего подхода:

# declare source array
a  = [:amazon, 
[{:price=>"  396 ", :author=>"Motwani", :name=>"Randomized Algorithms ", :url=>"", :source=>"amazon"}, 
{:price=>"  255 ", :author=>"Thomas H. Cormen", :name=>"Introduction To Algorithms ", :url=>"", :source=>"amazon"}]]

# convert to hash for easier processing
b = Hash[*a]

# now sort former inner table by price
b.merge!(b) {|k, v|  v.sort_by {|p| p[:price].to_i}}

# return to old representation
b.to_a[0]
=> [:amazon, [{:price=>"  255 ", :author=>"Thomas H. Cormen", :name=>"Introducti
on To Algorithms ", :url=>"", :source=>"amazon"}, {:price=>"  396 ", :author=>"M
otwani", :name=>"Randomized Algorithms ", :url=>"", :source=>"amazon"}]]
1 голос
/ 16 апреля 2011

На самом деле вы вводите пару (имя, [книга]), поэтому убедитесь, что вы сортируете только второй элемент пары (массив книг):

[source_array[0], source_array[1].sort_by { |book| book[:price].to_i }]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...