2016-11-11 2 views
2

Ich habe ein Array von Versionsnummern unique_versions genannt, die auf die Erhöhung hält:erhalten Sie die neueste Version von einem Array in Ruby

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 

und ich brauche die neueste (1.7.16) aus dem Array zu erhalten . Was ist die eleganteste Art, es zu tun? Ich erhalte diese Anordnung durch den folgenden Code:

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 zur Kenntnis, dass er die '-beta.2' Teile in einem Vorverarbeitungsschritt –

Antwort

6

Version Handling ist bereits in Gem::Version (und vielleicht andere) implementiert, keine Notwendigkeit, das Rad neu zu erfinden.

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

groß, genau das, was ich brauchte. – Scooby

+0

Ich empfehle, ['max_by'] (https://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-max_by) anstelle von' sort_by' zu verwenden, da es O (* n *) ist statt O (* n² *): 'string_versions.max_by {| s | Gem :: Version.new (s)} ' –

+0

@ Jordan: natürlich, danke. Aber 'sort_by' ist nicht O (N^2). –

2

Diese

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"] 

so

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

Hinweis zu funktionieren scheint, dass Sie diesen Teil neu schreiben kann

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

in etwas wie

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

Dank _strips_! Funktioniert gut, aber ich musste das andere wegen seiner Eleganz akzeptieren :) – Scooby

+0

Mach dir keine Sorgen :) – Ursus

+0

Sie haben Recht. Ich habe den Code aktualisiert. – Ursus

Verwandte Themen