【问题标题】:get the latest version from an array in ruby从 ruby​​ 的数组中获取最新版本
【发布时间】:2016-11-12 02:43:24
【问题描述】:

我有一个名为 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)。 ruby 最优雅的做法是什么?我通过以下代码得到这个数组:

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)

【问题讨论】:

  • @Stefan 请注意,他在预处理步骤中剥离 -beta.2 部分

标签: ruby-on-rails ruby rubygems chef-infra


【解决方案1】:

版本处理已经在Gem::Version(可能还有其他)中实现,无需重新发明轮子。

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

【讨论】:

  • 太棒了,正是我需要的。
  • 我建议使用 max_by 而不是 sort_by,因为它是 O(n) 而不是 O():string_versions.max_by {|s| Gem::Version.new(s) }
  • @Jordan:当然,谢谢。但是sort_by 不是 O(N^2)。
  • @SergioTulentsev Ruby 使用快速排序。 Quicksort is O(n²) in the worst case。也许您正在考虑平均情况,它是 O(n log n)。我的不好是没有更具体。当然,这取决于 Ruby 如何选择它的支点,我不确定。
【解决方案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

【讨论】:

  • 谢谢!效果很好,但我不得不接受另一个因为它的优雅:)
  • 别担心 :)
猜你喜欢
  • 2015-03-15
  • 2021-04-25
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多