Сортировка массивов Ruby — сбой с ошибкой типа: не удается преобразовать символ в целое число

#ruby

#ruby

Вопрос:

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

 [: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
  

Не уверен, какая индексация здесь идет не так

Комментарии:

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

2. Что такое source_array ? Из вашего примера есть две возможности. Вы должны прояснить это. Когда вы спрашиваете, вы должны указать, каковы ваши переменные. Вы пытаетесь отсортировать массив или хэш?

3. обновите ответ, чтобы включить точный вывод, который вы хотите.

4. Как говорит @Rekin в своем ответе, неясно, почему входные данные представляют собой пару. Это результат хэша.to_a или это действительно у вас есть. Больше нет магазинов, только Amazon? это не имеет смысла.

Ответ №1:

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

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

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

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

 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"}]]
  

Ответ №2:

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

 [source_array[0], source_array[1].sort_by { |book| book[:price].to_i }]