Ruby中数组哈希求最大元素数返回5而非7的原因咨询
问题原因分析
你遇到的问题核心在于:Ruby中数组的max方法默认是按照**字典序(lexicographical order)**来比较数组,而不是按照数组的长度来判断大小!
具体到你的场景:
- 当执行
FORMATS.map {|_,v| v}.max时,Ruby会逐个对比数组的元素:- 首先看每个数组的第一个元素:
'vertical'(来自vertical_4和mixed_3)的字典序比'large'(horizontal_2)、'horizontal'(horizontal_4、huge)都高(字母v的ASCII码大于l和h)。 - 接着在
vertical_4和mixed_3的数组间对比第二个元素:vertical_4的第二个元素是'small',mixed_3的是'horizontal','small'的字典序更高,因此vertical_4的数组会被选为max的结果。
- 首先看每个数组的第一个元素:
- 这个数组的长度是5,所以最终
MAX_ELEMENTS得到5,而非你预期的huge数组的长度7。
正确的解决方法
要获取哈希中数组的最大元素数量,有两种直观的正确写法:
方法1:先提取所有数组的长度,再取最大值
MAX_ELEMENTS = FORMATS.values.map(&:size).max
这种方式直接提取每个数组的长度,再从长度集合中找最大值,逻辑清晰易懂。
方法2:用max_by按长度筛选最长数组,再取长度
MAX_ELEMENTS = FORMATS.values.max_by(&:size).size
max_by会按照你指定的规则(这里是数组的size)筛选出符合条件的数组,再获取它的长度即可。
两种写法都能正确返回你预期的结果7。
内容的提问来源于stack exchange,提问作者Roberto Pezzali
相关产品推荐
相关产品推荐

