Будет ли это работать для вас?
domains.
map{|d| d.split(".")}.
sort_by(&:reverse).
map{|d| d.join(".") }
Редактировать: или действительно
domains.sort_by{|x| x.split(".").reverse}
Просто добавлю, я думаю, что нечто подобное заслуживает того, чтобы быть объектом значения, так как это не просто строки, и они имеют свои собственные атрибуты и особое поведение (например, такого рода).
Например:
class Domain
include Comparable
def initialize(string)
@string = string
end
def to_s
@string
end
def elements
@string.split(".")
end
protected def <=>(other)
elements.reverse <=> other.elements.reverse
end
def tld
elements.last
end
end
Итак, вы можете:
domains = [
Domain.new('api.test.google.com'),
Domain.new('dev.blue.google.com'),
Domain.new('dev.test.google.com'),
Domain.new('a.blue.google.com'),
]
domains.map(&:to_s)
=> ["api.test.google.com", "dev.blue.google.com", "dev.test.google.com", "a.blue.google.com"]
domains.sort.map(&:to_s)
=> ["a.blue.google.com", "dev.blue.google.com", "api.test.google.com", "dev.test.google.com"]
Вы также можете добавить любое другое поведение, например, способ возврата домена верхнего уровня.