按数字排序ruby数组

时间:2013-07-28 21:19:16

标签: ruby-on-rails ruby sorting

我在S3存储桶中有几百张图像,我将其写入数组并希望按字母顺序对它们进行排序和显示。图像都以相同的模式开始

#1 <some name>.jpg
#2 <some name>.jpg
...
#10 <some name>.jpg
#11 <some name>.jpg
...

使用后

@images.each do |image|
@image[i] = image.url_for(:read).to_s
    i = i + 1
end

@image.sort

然而,@ image数组正在以这种方式排序:

<s3 bucket URL>/#1 <some name>.jpg
<s3 bucket URL>/#10 <some name>.jpg
<s3 bucket URL>/#11 <some name>.jpg
...
<s3 bucket URL>/#2 <some name>.jpg
<s3 bucket URL>/#20 <some name>.jpg
<s3 bucket URL>/#21 <some name>.jpg
...

据我所知,“字母表”以及排序应排序#1,#2,#3等,但似乎并非如此。 显然,我希望它以这种方式排序:

<s3 bucket URL>/#1 <some name>.jpg
<s3 bucket URL>/#2 <some name>.jpg
<s3 bucket URL>/#3 <some name>.jpg
...
<s3 bucket URL>/#10 <some name>.jpg
<s3 bucket URL>/#11 <some name>.jpg
<s3 bucket URL>/#12 <some name>.jpg
...

在这种情况下,如何使用排序算法达到此目的? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

  

这是我的理解,“字母”,因此排序   应排序#1,#2,#3等。

这句话没有任何意义,但在计算机编程字母“1”出现在“2”之前,当Ruby比较字符串时,它逐字符地比较字符串直到找到差异。因此,当Ruby比较“11”和“2”时,它首先比较第一个字符,这意味着它比较“1”和“2”。因为字符不同,所以不再比较任何字符;因为“1”在“2”之前,字符串“11”在字符串“2”之前。

fnames = [
  "#1 <some name>.jpg",
  "#2 <some name>.jpg",
  "#10 <some name>.jpg",
  "#11 <some name>.jpg",
]


results = fnames.sort_by do |fname|
  match_data = fname.match(/#(\d+)/)
  match_data[1].to_i
end

p results

--output:--
["#1 <some name>.jpg", 
 "#2 <some name>.jpg", 
 "#10 <some name>.jpg", 
 "#11 <some name>.jpg"]

如果你进入一个衬垫:

results = fnames.sort_by {|fname| fname[/#(\d+)/, 1].to_i }

如果文件名可以包含相同的数字,那么您需要做更多的工作:

fnames = [
  "<s3 bucket URL>/#1 <some name>.jpg",
  "<s3 bucket URL>/#10 <some name>.jpg",
  "<s3 bucket URL>/#11 xyz.jpg",
  "<s3 bucket URL>/#11 abc.jpg",
  "<s3 bucket URL>/#2 <some name>.jpg", 
  "<s3 bucket URL>/#20 <some name>.jpg",
  "<s3 bucket URL>/#21 <some name>.jpg",
]

results = fnames.sort_by do |fname| 
  [
    fname[/#(\d+)/, 1].to_i, 
    $'    #The rest of the string after the match
  ]
end


p results

--output:--
["<s3 bucket URL>/#1 <some name>.jpg", 
 "<s3 bucket URL>/#2 <some name>.jpg", 
 "<s3 bucket URL>/#10 <some name>.jpg", 
 "<s3 bucket URL>/#11 abc.jpg", 
 "<s3 bucket URL>/#11 xyz.jpg", 
 "<s3 bucket URL>/#20 <some name>.jpg", 
 "<s3 bucket URL>/#21 <some name>.jpg"]

Ruby类似于字符串对数组进行排序:它比较数组中的第一个元素,如果它们相同,则比较第二个元素等,直到找到差异为止。 sort_by()块告诉Ruby假装每个文件名实际上是一个双元素数组。

答案 1 :(得分:1)

@images.sort_by{ |filename| filename[1..-1].to_i }