如何排序字符串数组

时间:2017-02-22 13:14:29

标签: arrays ruby sorting

我正在使用铁轨上的红宝石,我是新来的,还有铁轨上的红宝石。 我正在研究一个项目,并找到一些排序包含图像名称的字符串数组的问题。我尝试了很多算法,我知道这对我没有帮助。当我调用服务进行图像提取时,它给了我这样的数组。

示例:

["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"]

我尝试了很多东西但无法获得任何解决方案。请帮帮我。

3 个答案:

答案 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