marks, names = [h[:total_marks], h[:student_name]].transpose.
sort_by(&:first).transpose
#=> [[25, 50, 100], ["B", "C", "A"]]
{ student_name: names, total_marks: marks }
#=> {:student_name=>["B", "C", "A"], :total_marks=>[25, 50, 100]}
шаги:
a = [h[:total_marks], h[:student_name]]
#=> [[100, 25, 50], ["A", "B", "C"]]
b = a.transpose
#=> [[100, "A"], [25, "B"], [50, "C"]]
c = b.sort_by(&:first)
#=> [[25, "B"], [50, "C"], [100, "A"]]
d = c.transpose
#=> [[25, 50, 100], ["B", "C", "A"]]
marks, names = d
#=> [[25, 50, 100], ["B", "C", "A"]]
marks
#=> [25, 50, 100]
names
#=> ["B", "C", "A"]
{ student_name: names, total_marks: marks }
#=> {:student_name=>["B", "C", "A"], :total_marks=>[25, 50, 100]}
Обратите внимание, что два массива транспонированные являются 2xN и NX2, где N есть число студентов. Эти массивы потребуют небольшой памяти, и перенос их будет очень быстрым по сравнению с операцией сортировки, за исключением, возможно, для однокомнатных школ.
Первоначально я использовал sort
, а не sort_by(&:first)
, но изменилось к последнему после прочтения @ комментарий theTinMan на @ ответ Адама, а затем запустить этот простой тест:
require 'fruity'
n = 100_000
m = (0..10_000).to_a
a = Array.new(n) { [m.sample, m.sample] }
compare do
sort { a.sort }
sort_by { a.sort_by(&:first) }
end
Running each test once. Test will take about 11 seconds.
sort_by is faster than sort by 5x ± 1.0 (results differ: [[0, 9243], [0, 3145],...
Как указано, sort
и sort_by(&:first)
нет те же возвращаемые значения. При сравнении пар кортежей с использованием sort
, второй элемент кортежей является тай-брейкером, когда первые элементы равны, тогда как sort_by(&:first)
не имеет тай-брейкера.
Ваш ожидаемый хэш недействителен. – sawa
Одно из предложений, которое я хотел бы сделать, - это объединить ваши данные, а не как два параллельных массива. В противном случае вам может быть трудно достичь требуемой масштабируемости, потому что одна процедура должна сначала отсортировать массив ': total_marks' и выполнить тот же набор шагов в массиве': student_name'. См. 'Struct' в рубиновых документах о том, как это сделать. –
Вы должны удалить тег Rails. –