Опция с использованием data.table
data.table::transpose(asdf)
#[[1]]
#[1] 1 10
#[[2]]
#[1] 2 20
#[[3]]
#[1] 3 30
#[[4]]
#[1] 4 40
#[[5]]
#[1] 5 50
Как насчет:
ordered_list = [[1, "b"], [1, "a"], [2, "a"]]
ordered_list.sort! do |a,b|
[a[0],b[1]] <=> [b[0], a[1]]
end
Я имел эту ту же основную проблему и решил ее путем добавления этого:
class Inverter
attr_reader :o
def initialize(o)
@o = o
end
def <=>(other)
if @o.is && other.o.is
-(@o <=> other.o)
else
@o <=> other.o
end
end
end
Это - обертка, которая просто инвертирует < => функция, которая затем позволяет Вам делать вещи как это:
your_objects.sort_by {|y| [y.prop1,Inverter.new(y.prop2)]}
Enumerable#multisort
универсальное решение, которое может быть применено к массивам любой размер , не только те, которые имеют 2 объекта. Аргументами являются булевские переменные, которые указывают, должно ли определенное поле быть отсортировано, возросши или убывая (использование ниже):
items = [
[3, "Britney"],
[1, "Corin"],
[2, "Cody"],
[5, "Adam"],
[1, "Sally"],
[2, "Zack"],
[5, "Betty"]
]
module Enumerable
def multisort(*args)
sort do |a, b|
i, res = -1, 0
res = a[i] <=> b[i] until !res.zero? or (i+=1) == a.size
args[i] == false ? -res : res
end
end
end
items.multisort(true, false)
# => [[1, "Sally"], [1, "Corin"], [2, "Zack"], [2, "Cody"], [3, "Britney"], [5, "Betty"], [5, "Adam"]]
items.multisort(false, true)
# => [[5, "Adam"], [5, "Betty"], [3, "Britney"], [2, "Cody"], [2, "Zack"], [1, "Corin"], [1, "Sally"]]
Я уже довольно давно использую рецепт Гленна. Устав копировать код из проекта в проект снова и снова, я решил превратить его в жемчужину: