Skip to content

Instantly share code, notes, and snippets.

@gregeng
Created October 14, 2013 18:57
Show Gist options
  • Save gregeng/6980284 to your computer and use it in GitHub Desktop.
Save gregeng/6980284 to your computer and use it in GitHub Desktop.
version_sort, accounts for differences in the letter before .ext by converting it to the ASCII code first
require 'pry'
class Array
def version_sort
array = self.sort_by do |file|
file.gsub(/[a-z].ext/) {|x| x.ord }
end
array.sort_by do |item|
item.scan(/\d+|[a-z]*/).collect do |el|
el.to_i
end
end
end
end
filenames = [
"foo-1.10.2.ext",
"foo-1.11.ext",
"foo-1.3.ext",
"foo-1.50.ext",
"foo-1.8.7.ext",
"foo-1.9.3.ext",
"foo-1.ext",
"foo-10.1.ext",
"foo-10.ext",
"foo-100.ext",
"foo-13.ext",
"foo-2.0.0.ext",
"foo-2.0.1.ext",
"foo-2.0.ext",
"foo-2.007.ext",
"foo-2.01.ext",
"foo-2.012b.ext",
"foo-2.01a.ext",
"foo-2.0b.ext",
"foo-2.0a.ext",
"foo-2.1.ext",
"foo-25.ext",
"foo-6.ext",
]
version_sorted_filenames = [
"foo-1.ext",
"foo-1.3.ext",
"foo-1.8.7.ext",
"foo-1.9.3.ext",
"foo-1.10.2.ext",
"foo-1.11.ext",
"foo-1.50.ext",
"foo-2.0.ext",
"foo-2.0a.ext",
"foo-2.0b.ext",
"foo-2.0.0.ext",
"foo-2.0.1.ext",
"foo-2.01.ext",
"foo-2.1.ext",
"foo-2.01a.ext",
"foo-2.007.ext",
"foo-2.012b.ext",
"foo-6.ext",
"foo-10.ext",
"foo-10.1.ext",
"foo-13.ext",
"foo-25.ext",
"foo-100.ext",
]
# assert_equal filenames.version_sort, version_sorted_filenames
p (filenames.version_sort == version_sorted_filenames)
# puts (filenames.version_sort)
# puts filenames.sort_by {|word| word.length}
# binding.pry
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment