Bagaimana cara menulis sepotong kode untuk membandingkan beberapa string versi dan mendapatkan yang terbaru?
Sebagai contoh string seperti: '0.1', '0.2.1', '0.44'.
Bagaimana cara menulis sepotong kode untuk membandingkan beberapa string versi dan mendapatkan yang terbaru?
Sebagai contoh string seperti: '0.1', '0.2.1', '0.44'.
Jawaban:
Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1')
Gem::Version...sintaks membuat saya pikir saya akan perlu menginstal permata. Tapi itu tidak diperlukan.
Gem::Dependency.new(nil, '~> 1.4.5').match?(nil, '1.4.6beta4')
require 'rubygems'untuk mendapatkan akses ke Gemnamespace. Dari 1.9, bagaimanapun, itu secara otomatis disertakan.
Jika Anda perlu memeriksa batasan versi pesimis , Anda dapat menggunakan Gem :: Dependency seperti ini:
Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
Gem::Dependency.new('', '~> 1.4.5').match?('', '1.4.6beta4')
class Version < Array
def initialize s
super(s.split('.').map { |e| e.to_i })
end
def < x
(self <=> x) < 0
end
def > x
(self <=> x) > 0
end
def == x
(self <=> x) == 0
end
end
p [Version.new('1.2') < Version.new('1.2.1')]
p [Version.new('1.2') < Version.new('1.10.1')]
vers = (1..3000000).map{|x| "0.0.#{x}"}; 'ok' puts Time.now; vers.map{|v| ComparableVersion.new(v) }.sort.first; puts Time.now # 24 seconds 2013-10-29 13:36:09 -0700 2013-10-29 13:36:33 -0700 => nil puts Time.now; vers.map{|v| Gem::Version.new(v) }.sort.first; puts Time.now # 41 seconds 2013-10-29 13:36:53 -0700 2013-10-29 13:37:34 -0700 Gumpalan kode membuatnya jelek, tetapi pada dasarnya, menggunakan ini vs Permata :: Versi sekitar dua kali lebih cepat.
Anda dapat menggunakan Versionomypermata (tersedia di github ):
require 'versionomy'
v1 = Versionomy.parse('0.1')
v2 = Versionomy.parse('0.2.1')
v3 = Versionomy.parse('0.44')
v1 < v2 # => true
v2 < v3 # => true
v1 > v2 # => false
v2 > v3 # => false
Saya akan melakukannya
a1 = v1.split('.').map{|s|s.to_i}
a2 = v2.split('.').map{|s|s.to_i}
Maka Anda bisa melakukannya
a1 <=> a2
(dan mungkin semua perbandingan "biasa" lainnya).
... dan jika Anda menginginkan tes <atau >, Anda dapat melakukan mis
(a1 <=> a2) < 0
atau lakukan beberapa fungsi lainnya jika Anda ingin.
Gem::Version adalah cara mudah untuk pergi ke sini:
%w<0.1 0.2.1 0.44>.map {|v| Gem::Version.new v}.max.to_s
=> "0.44"
Jika Anda ingin melakukannya dengan tangan tanpa menggunakan permata apa pun, sesuatu seperti berikut ini akan berfungsi, meskipun kelihatannya agak buruk.
versions = [ '0.10', '0.2.1', '0.4' ]
versions.map{ |v| (v.split '.').collect(&:to_i) }.max.join '.'
Pada dasarnya, Anda mengubah setiap string versi menjadi array bilangan bulat dan kemudian menggunakan operator perbandingan array . Anda dapat memecah langkah-langkah komponen untuk mendapatkan sesuatu yang sedikit lebih mudah diikuti jika ini masuk dalam kode yang perlu dipertahankan seseorang.
Saya memiliki masalah yang sama, saya ingin komparator versi tanpa Permata, muncul dengan ini:
def compare_versions(versionString1,versionString2)
v1 = versionString1.split('.').collect(&:to_i)
v2 = versionString2.split('.').collect(&:to_i)
#pad with zeroes so they're the same length
while v1.length < v2.length
v1.push(0)
end
while v2.length < v1.length
v2.push(0)
end
for pair in v1.zip(v2)
diff = pair[0] - pair[1]
return diff if diff != 0
end
return 0
end
Versionkelas sederhana yang melakukan semua yang saya butuhkan: shorts.jeffkreeftmeijer.com/2014/…