Ruby min函数没有选择最短的字符串

时间:2014-10-20 16:51:07

标签: ruby string

我不明白为什么min选择最长的字符串而不是最短的字符串:

x='AGG'
y='AAAACTGACCCACCCCAGG'
[x,y].min #=> "AAAACTGACCCACCCCAGG" # why is this the min one?
[x,y].max #=> "AGG"

a='AGAGACTTA'
b='AAA'
[b,a].min #=> "AAA" # good
[b,a].max #=> "AGAGACTTA"

4 个答案:

答案 0 :(得分:1)

因为它不是按字符串长度进行比较,而是按字典顺序进行比较;并AA来到AG之前。如果要按长度进行比较,则需要指定它:

p [x,y].min_by(&:length)

答案 1 :(得分:1)

通常Ruby使用名为lexicographical ordering的东西来获取最小和最大字符串。因此AGG > AAAACTGACCCACCCCAGG,因为G > A(他们的第一个字母不同)。

要获得预期的行为,您需要手动提供比较器块,如下所示:

[x,y].min { |x,y| x.size <=> y.size }

答案 2 :(得分:0)

问题是min / max不能达到你的想象。它不比较字符串大小,只是按字母顺序给你第一个。 幸运的是,min / max函数允许您定义如何检查哪个对象更大。尝试类似:

arr.min {|a,b| a.length <=> b.length}
arr.max {|a,b| a.length <=> b.length}

答案 3 :(得分:0)

Ruby的min函数按字符串是否大于另一个字符串进行排序。在这种情况下,字符串Y出现在字母表中比字符串X更早,因此它比字符串X小。如果你想找到哪个是最短的字符串,你可以做类似的事情。

[x,y].min_by(&:length)
=> "AGG"

找到你要做的最长的字符串

[x,y].max_by(&:length)