Как отсортировать не простой хеш (хеш хешей)

Для первого сообщения, что данные, отправленные всем получателям, фактически идентичны, таким образом, MPI_Bcast является правильным подходом. Второе сообщение распределяет разные порции большего массива среди получателей, это делается вместе с MPI_Scatter. Обратите внимание, что в сообщении разброс включает в себя корневой ранг, поэтому вы можете опустить локальную копию вручную.

5
задан Kavu 12 December 2008 в 07:23
поделиться

3 ответа

Я изменил бы структуру данных на массив хешей:

my_array =
[
  {:id => 78, :value=>64, :rating=>-155},
  {:id => 84, :value=>90, :rating=>-220},
  {:id => 95, :value=>39, :rating=>-92}
]

Можно отсортировать этот вид структуры легко с

my_array.sort_by { |record| record[:rating] }

Для получения подобной хешу функциональности выборки записи идентификатором, можно определить новый метод на my_array:

def my_array.find_by_id(id) 
  self.find { |hash| hash[:id] == id }
end

так после этого можно сделать

my_array.find_by_id(id)

вместо

my_hash[id]
6
ответ дан 18 December 2019 в 13:20
поделиться

Хеши в Ruby не могут быть отсортированы (по крайней мере, не прежде 1.9)

Это означает, что цикличное выполнение через Хеш не обязательно приведет к информации в правильном порядке для Вас. Однако это тривиально для цикличного выполнения через Хешированные данные в особом порядке путем преобразования его в Массив сначала, и на самом деле вызов методов сортировки для Хеша преобразует его в Массив для Вас:

>> { :a => 4, :b => 12, :c => 3, :d => 8 }.sort_by { |key, value| value }
=> [[:c, 3], [:a, 4], [:d, 8], [:b, 12]]

Таким образом в Вашем случае:

hsh.sort_by {|key, ratings| ratings[:rating] }
5
ответ дан 18 December 2019 в 13:20
поделиться

Могла бы быть лучшая структура данных, но (я предполагаю, что это рубиново), возможно сделать в Ruby при помощи встроенного стиля сортировки, чтобы в основном сказать это, как сравнить два. Вот конкретный пример:

my_hash = { 
  55 => {:value=>61, :rating=>-147},
  89 => {:value=>72, :rating=>-175},
  78 => {:value=>64, :rating=>-155},
  84 => {:value=>90, :rating=>-220},
  95 => {:value=>39, :rating=>-92},
  46 => {:value=>97, :rating=>-237},
  52 => {:value=>73, :rating=>-177},
  64 => {:value=>69, :rating=>-167},
  86 => {:value=>68, :rating=>-165},
  53 => {:value=>20, :rating=>-45}
}

puts "MY HASH"
my_hash.each do |local|
  puts local
end

sorted_hash = my_hash.sort  { | leftval, rightval | rightval[1][:rating]<=>leftval[1][:rating] }

puts "SORTED HASH"
sorted_hash.each do |local|
  puts local
end
3
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: