ruby - 按反向值对字符串数组进行排序
问题描述
现在我已经生成了以下代码来对域列表进行排序
domains = [
'api.test.google.com',
'dev.blue.google.com',
'dev.test.google.com',
'a.blue.google.com'
]
filtered = []
domains.each { |domain| filtered.push domain.reverse! }
domains.sort!
domains.each { |domain| filtered.push domain.reverse! }
此代码的输出将是:
["a.blue.google.com", "dev.blue.google.com", "api.test.google.com", "dev.test.google.com"]
我试图找到一种方法来使它更优雅,因为它看起来不是解决这个问题的最佳解决方案,但我在弄清楚什么是问题时遇到了问题。
谢谢您的帮助!
解决方案
这对你有用吗?
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"]
您还可以添加您喜欢的任何其他行为,例如返回顶级域的方法。
推荐阅读
- powershell - Powershell - 用文件名中的固定字符重命名文件夹
- r - 如何从多列中的数据创建图形(ggplot)
- linq - 无法检查 int 列表是否完全包含在另一个 int 列表中
- reactjs - 具有多个孩子的高阶组件
- javascript - 为什么当第二个事件监听器被触发时第一个事件监听器停止工作?
- angular - 在 TypeScript 中通过 innerHTML 加载 Angular 组件
- javascript - Cordova 电子发布到 s3
- maxscale - 如何更改 GUI 的默认 MaxScale 凭据
- javascript - 如何从 Firestore 中检索特定范围的数据
- python - WinAppDriver,clickOnce 应用程序启动一个对话框 - 查找应用程序的问题