2016-11-11 90 views
2

得到一个数组的最新版本我有一个名为unique_versions版本号的阵列上增加不断:红宝石

1.7.16 
1.7.14 
1.7.13 
1.7.12 
1.7.9 
1.7.7 
1.7.5 
1.7.4 
1.7.2 
1.6.2 
1.2.1 
1.2.0 
1.1.0 
0.0.1 

,我需要从数组的最新版本(1.7.16) 。最优雅的红宝石做什么方式?我用下面的代码获得这个数组:

require "json" 
require "open-uri" 
require 'openssl' 

string_object = open("https://xxx", :http_basic_authentication=>["xxx"], :ssl_verify_mode=>OpenSSL::SSL::VERIFY_NONE) 
json_file = JSON.parse(string_object.read) 
version_array = Array.new 
json_file["results"].each do |version| 
    version_array.push(version["version"].sub /-.*$/, '') 
end 
unique_versions=(version_array.uniq) 
+1

@Stefan注意到,他_strips_了'-beta.2'部分在预处理步骤 –

回答

6

版本处理已在Gem::Version(也许是其他)中实现,不需要重新发明轮子。

string_versions.max_by{ |s| Gem::Version.new(s) } # => "1.7.16" 
+0

很棒,就是我需要的。 – Scooby

+0

我建议使用['max_by'](https://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-max_by)而不是'sort_by',因为它是O(* n *)而不是O(*n²*):'string_versions.max_by {| s | Gem :: Version.new(s)}' –

+0

@Jordan:当然,谢谢。但'sort_by'不是O(N^2)。 –

2

这似乎是工作

unique_versions.sort_by { |version| version.split('.').map(&:to_i) } 
=> ["0.0.1", "1.1.0", "1.2.0", "1.2.1", "1.6.2", "1.7.2", "1.7.4", "1.7.5", "1.7.7", "1.7.9", "1.7.12", "1.7.13", "1.7.14", "1.7.16"] 

所以

unique_versions.max_by { |version| version.split('.').map(&:to_i) } 
=> "1.7.16" 

注意,您可以在改写这一部分

version_array = Array.new 
json_file["results"].each do |version| 
    version_array.push(version["version"].sub /-.*$/, '') 
end 
unique_versions=(version_array.uniq) 

unique_versions = json_file["results"].map { |version| version["version"].sub /-.*$/, '' }.uniq 
+0

谢谢!很好的工作,但我不得不接受另一个,因为它的优雅:) – Scooby

+0

别担心:) – Ursus

+0

你说得对。我更新了代码。 – Ursus