我正在使用铁轨上的红宝石,我是新来的,还有铁轨上的红宝石。 我正在研究一个项目,并找到一些排序包含图像名称的字符串数组的问题。我尝试了很多算法,我知道这对我没有帮助。当我调用服务进行图像提取时,它给了我这样的数组。
示例:
["page-1_1.png",
"page-1_10.png",
"page-1_11.png",
"page-1_2.png",
"page-1_3.png",
"page-1_4.png",
"page-1_5.png",
"page-1_6.png",
"page-1_7.png",
"page-1_8.png",
"page-1_9.png"]
我想按如下方式对此数组进行排序:
["page-1_1.png",
"page-1_2.png",
"page-1_3.png",
"page-1_4.png",
"page-1_5.png",
"page-1_6.png",
"page-1_7.png",
"page-1_8.png",
"page-1_9.png",
"page-1_10.png",
"page-1_11.png"]
我尝试了很多东西但无法获得任何解决方案。请帮帮我。
答案 0 :(得分:10)
names.sort_by { |name| name.scan(/\d+/).map(&:to_i) }
这将查找每个文件名中的所有数字,并按所述数字排序。请注意,数组是通过比较第一个元素来排序的,如果是相等的 - 第二个,依此类推。
答案 1 :(得分:2)
对于给定的数组arr
,这是一个非常常见的解决方案。
require 'ipaddr'
arr.sort_by { |s| IPAddr.new(s.gsub(/\D/) { |c| c == '_' ? '.' : '' } + '.0.0') }
#=> ["page-1_1.png",
# "page-1_2.png",
# "page-1_3.png",
# "page-1_4.png",
# "page-1_5.png",
# "page-1_6.png",
# "page-1_7.png",
# "page-1_10.png",
# "page-1_11.png",
# "page-3_92.png",
# "page-11_8.png"]
请注意
arr.map { |s| IPAddr.new(s.gsub(/\D/) { |c| c == '_' ? '.' : '' } + '.0.0') }
#=> [#<IPAddr: IPv4:1.1.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.10.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.11.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.2.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.3.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.4.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.5.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.6.0.0/255.255.255.255>,
# #<IPAddr: IPv4:1.7.0.0/255.255.255.255>,
# #<IPAddr: IPv4:11.8.0.0/255.255.255.255>,
# #<IPAddr: IPv4:3.92.0.0/255.255.255.255>]
答案 2 :(得分:2)
如果您知道页数有界(例如小于1000),则此方法具有按字母顺序和数字顺序排序的优势:
arr =
['page-1_1.png',
'page-1_10.png',
'page-1_11.png',
'page-1_3.png',
'page-1_9.png']
puts arr.sort_by{ |str| str.gsub(/\d+/){ |number| number.rjust(3, '0') } }
# page-1_1.png
# page-1_3.png
# page-1_9.png
# page-1_10.png
# page-1_11.png
puts %w(b c a).sort_by{ |str| str.gsub(/\d+/){ |number| number.rjust(3, '0') } }
# a
# b
# c
以下是正在排序的临时字符串:
puts arr.map{ |str| str.gsub(/\d+/){ |number| number.rjust(3, '0') } }
# page-001_001.png
# page-001_010.png
# page-001_011.png
# page-001_003.png
# page-001_009.png