Как отсортировать массив в Ruby в определенном порядке?
Я хочу отсортировать массив в определенном порядке, заданный в другом массиве.
EX: рассмотрим массив
a=["one", "two", "three"]
b=["two", "one", "three"]
Теперь я хочу отсортировать массив 'a' в порядке 'b', i.e
a.each do |t|
# It should be in the order of 'b'
puts t
end
Таким образом, выход должен быть
two
one
three
Любые предложения?
Ответы
Ответ 1
Массив # sort_by - это то, что вам нужно.
a.sort_by do |element|
b.index(element)
end
Более масштабируемая версия в ответ на комментарий:
a=["one", "two", "three"]
b=["two", "one", "three"]
lookup = {}
b.each_with_index do |item, index|
lookup[item] = index
end
a.sort_by do |item|
lookup.fetch(item)
end
Ответ 2
Если b
содержит все элементы a
, и если элементы уникальны, то:
puts b & a
Ответ 3
Предполагая, что a
нужно сортировать по порядку элементов в b
sorted_a =
a.sort do |e1, e2|
b.index(e1) <=> b.index(e2)
end
Обычно я использую это для сортировки сообщений об ошибках в ActiveRecord
в порядке появления полей в форме.