这里有一个方法,使“橙色”,“黄”,“蓝”是在每个阵列中的任何位置,并且每个数组可能不包含这些三种颜色中的一些或全部。使用给定的字符串排序对每个数组以及包含数组进行排序。正常阵列排序适用,因此,如果每两个阵列的第一个元素是相同的,所述第二元件相比较,等等
我暂时重新定义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。写得很好的问题。非常简洁。 – 2014-10-12 03:44:51