2016-11-11 95 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