Вот такой подход, который позволяет «Апельсин», «Желтый» и «Blue», чтобы быть в любом месте в каждом массиве, и каждый массив может содержать не все, некоторые или все эти три цвета. Каждый массив, а также содержащий массив сортируются, используя заданный порядок строк. Нормальная сортировка массива применяется, так что, если первый элемент каждого из двух массивов одинаковы, вторые элементы сравниваются, и т.д.
я временно переопределить String#<=>, то вроде обычным способом, а затем восстановить String#<=>
перед возвращением.
Код
def reorder(arr)
String.send(:alias_method, :old_compare, :<=>)
String.class_eval do
define_method(:<=>) do |other|
order = ["Blue", "Yellow", "Orange"] # increasing priority
self_ndx = order.index(self) || -1
other_ndx = order.index(other) || -1
other_ndx <=> self_ndx
end
end
a = arr.map(&:sort).sort
String.send(:alias_method, :<=>, :old_compare)
String.send(:undef_method, :old_compare)
a
end
Примеры
reorder [["Red", "Blue"], ["Green", "Orange"], ["Purple", "Yellow"]]
#=> [["Orange", "Green"], ["Yellow", "Purple"], ["Blue", "Red"]]
reorder [["Blue", "Orange"], ["Purple", "Green"], ["Purple", "Orange"]]
#=> [["Orange", "Blue"], ["Orange", "Purple"], ["Purple", "Green"]]
reorder [["Yellow", "Orange"], ["Orange", "Orange"], ["Blue", "Yellow"]]
#=> [["Orange", "Orange"], ["Orange", "Yellow"], ["Yellow", "Blue"]]
reorder [["Yellow", "Purple"], ["Purple", "Orange", "Blue"], ["Blue", "Yellow"]]
#=> [["Orange", "Blue", "Purple"], ["Yellow", "Blue"], ["Yellow", "Purple"]]
Добро пожаловать на SO. Хороший письменный вопрос. Очень кратки. –