Làm thế nào để viết một đoạn mã để so sánh một số chuỗi phiên bản và nhận được phiên bản mới nhất?
Ví dụ chuỗi thích: '0.1', '0.2.1', '0.44'
.
Làm thế nào để viết một đoạn mã để so sánh một số chuỗi phiên bản và nhận được phiên bản mới nhất?
Ví dụ chuỗi thích: '0.1', '0.2.1', '0.44'
.
Câu trả lời:
Gem::Version.new('0.4.1') > Gem::Version.new('0.10.1')
Gem::Version...
cú pháp khiến tôi nghĩ tôi sẽ cần phải cài đặt một viên ngọc. Nhưng nó không được yêu cầu.
Gem::Dependency.new(nil, '~> 1.4.5').match?(nil, '1.4.6beta4')
require 'rubygems'
có quyền truy cập vào Gem
không gian tên. Tuy nhiên, từ ngày 1.9 trở đi, nó sẽ tự động được đưa vào.
Nếu bạn cần kiểm tra các ràng buộc phiên bản bi quan , bạn có thể sử dụng Gem :: Dependency như sau:
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
Code blob đang làm cho nó trở nên xấu xí, nhưng về cơ bản, sử dụng phiên bản này so với Gem :: Nhanh hơn khoảng hai lần.
Bạn có thể sử dụng Versionomy
đá quý (có tại 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
tôi sẽ làm
a1 = v1.split('.').map{|s|s.to_i}
a2 = v2.split('.').map{|s|s.to_i}
Sau đó, bạn có thể làm
a1 <=> a2
(và có thể là tất cả những so sánh "thông thường" khác).
... và nếu bạn muốn có một <
hoặc >
kiểm tra, bạn có thể làm như
(a1 <=> a2) < 0
hoặc thực hiện một số gói chức năng khác nếu bạn đang muốn.
Gem::Version
là cách dễ dàng để đi đến đây:
%w<0.1 0.2.1 0.44>.map {|v| Gem::Version.new v}.max.to_s
=> "0.44"
Nếu bạn muốn làm điều đó bằng tay mà không sử dụng bất kỳ viên đá quý nào, những thứ như sau sẽ hoạt động, mặc dù nó trông hơi nghiêm túc.
versions = [ '0.10', '0.2.1', '0.4' ]
versions.map{ |v| (v.split '.').collect(&:to_i) }.max.join '.'
Về cơ bản, bạn chuyển từng chuỗi phiên bản thành một mảng số nguyên và sau đó sử dụng toán tử so sánh mảng . Bạn có thể chia nhỏ các bước thành phần để có thứ gì đó dễ làm theo hơn một chút nếu điều này xảy ra trong mã mà ai đó sẽ cần phải duy trì.
Tôi đã gặp vấn đề tương tự, tôi muốn có một trình so sánh phiên bản không có Gem, đã nghĩ ra điều này:
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
Version
lớp đơn giản thực hiện mọi thứ tôi cần: shorts.jeffkreeftmeijer.com/2014/…