Как отсортировать массив в Ruby по определенному порядку? - PullRequest
27 голосов
/ 26 ноября 2010

Я хочу отсортировать массив в определенном порядке, указанном в другом массиве.

EX: рассмотрим массив

a=["one", "two", "three"]
b=["two", "one", "three"]

Теперь я хочу отсортировать массив 'a' в порядке 'b', т.е.

a.each do |t|
  # It should be in the order of 'b'
  puts t
end

Таким образом, вывод должен быть

two
one 
three 

Есть предложения?

Ответы [ 3 ]

49 голосов
/ 26 ноября 2010

Array # 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
12 голосов
/ 26 ноября 2010

Если b включает все элементы a и если элементы уникальны, то:

puts b & a
10 голосов
/ 26 ноября 2010

Предполагается, что a должно быть отсортировано по порядку элементов в b

sorted_a = 
a.sort do |e1, e2|
  b.index(e1) <=> b.index(e2)
end

Обычно я использую это для сортировки сообщений об ошибках в ActiveRecord в порядке появления полей в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...