Max函数不返回数组中的最大值

时间:2014-09-30 19:40:32

标签: ruby string

我的未排序数组为some_array。当我使用some_array.max获取最大数量时,我得到以下输出。为:

some_array = ["1.10.0", "1.11.0", "1.12.0", "1.13.0", "1.14.0", "1.15.0", "1.16.0",
"1.16.1", "1.17.0", "1.18.0", "1.7.0", "1.8.0"]

我得到1.8.0而不是1.18.0。为:

some_array = ["1.11.0", "1.12.0", "1.13.0", "1.14.0", "1.14.1", "1.15.0", "1.16.0", "1.17.0", "1.18.0", "1.19.0", "1.5.0", "1.8.0", "1.9.0"]

我得到1.9.0而不是1.19.0

对我来说,看起来max正在从数组中获取最后一个值。不应该max打印数组中的最大值吗?在使用max之前,我是否必须对数组进行排序?有没有其他方法可以从阵列中获取最大值?

5 个答案:

答案 0 :(得分:1)

问题在于你认为它们是整数,但它们不是 - 它们是字符串。所以他们得到排序lexicographically。也就是说,将它们视为字母表。 " 1.8.0" 大于" 1.18.0",因为" 8"大于" 1"角色(在第3位)。

查看以下随机字符串。它们是有序的:

  1. " ABCDEF"
  2. " abdghi"
  3. " adaaaa"
  4. 他们为什么要整理好?因为你看第一个字符,并比较它们。然后查看下一个字符,并比较它们等。现在看看你的例子:

    1. " 1.18.0"
    2. " 1.8.0"
    3. 看看每个人的第一个角色,它是一个" 1",它是相等的。看看下一个角色,两者都是"。",它们相等。看看下一个角色," 1"和" 8"。 " 1"来自" 8"。因此," 1.8.0"在" 1.18.0"。

      之后必须按字典顺序进行

      如果你想像整数一样对待它们,你可以做一些事情。 1)您可以在一个块中编写自己的排序方法,或者2)将字符串包装在一些手工制作的Version对象中,然后在那里写comparator

      如果您需要有关这些具体想法的帮助,请告诉我们。

答案 1 :(得分:1)

现有的答案已经指出了代码中的问题。这就是你写它的方式:

some_array.max_by { |version| version.split(".").map(&:to_i) }
#=> "1.18.0"

答案 2 :(得分:0)

  

不应该max()打印数组中的最大值吗?

是。这应该。它正在这样做,你可以在你得到的结果中看到。

  

在使用max()之前我是否必须对数组进行排序?

没有

  

还有其他方法可以从阵列中获取最大值吗?

是。但是你已经获得了最大值。

答案 3 :(得分:0)

此方法逐字符检查。

因此,比较1.9.0和1.19.0,它将给出1.9.0大于1.19.0因为部分“1”。在两个字符串中都是相等的,但是下一个字符在第一个字符中是9,在第二个字符中是1,所以该方法会说1.9.0更大,因为在ASCII代码中9比1晚。

答案 4 :(得分:0)

当您需要对版本号进行排序时,Versionomy Gem会有很大帮助。它还处理所有边缘情况,例如beta和RC版本:1.8beta < 1.8RC < 1.8

使用该gem,您必须将代码更改为以下内容:

require 'versionomy'

some_array.max_by { |version| Versionomy.parse(version) }