Книга: Программирование на языке Ruby

8.1.25. Синхронная сортировка нескольких массивов

8.1.25. Синхронная сортировка нескольких массивов

Предположим, что необходимо отсортировать массив, которому соответствуют «параллельные» массивы, то есть в соответственных позициях находятся логически связанные данные. Не хотелось бы, чтобы в результате сортировки это соответствие нарушилось.

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

class Array
 def sort_index
  d=[]
  self.each_with_index{|x, i| d[i]=[x,i]}
  if block_given?
   d.sort {|x,у| yield x[0],y[0]}.collect{|x| x[1]}
  else
   d.sort.collect{|x| x[1]}
  end
 end
 def sort_with(ord=[])
  return nil if self.length!=ord.length
  self.values_at(*ord)
 end
end
a = [21, 33, 11, 34, 36, 24, 14]
b = a.sort_index
a2 = a.sort_with(b)
c = a.sort_index {|x,y| x%2 <=> y%2 }
a3 = a.sort_with(c)
p a  # [21, 33, 11, 34, 36, 24, 14]
p b  # [2,6,0,5,1,3,4]
p a2 # [11, 14, 21, 24, 33, 34, 36]
p c  # [6, 5, 4, 3, 2, 1, 0]
p a3 # [14, 24, 36, 34, 11, 33, 21]

Оглавление книги

Оглавление статьи/книги

Генерация: 1.408. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз