2015-05-23 3 views
0

Я очень смущен здесь.Ruby Array и .max

Почему ["4", "5", "29", "54", "4", "0", "-214", "542", "-64", "1", "-3", "6", "-6"].max

возврат товара 6 и не 542

После удаления 6 из массива, то он возвращает 542

использованием .min правильно работает, как хорошо.

/ум поражали

Для справки, я использую Ruby, Иды от CodeWars, tutorialspoint.com и labs.codecademy.com/

+0

Это потому, что вы сравниваете строки, а не числа. «6bd» лексически больше, чем «542», и поэтому так «6». –

+0

Ой, понял! Это имеет смысл ..... Спасибо, Мартин! – RonCode

+0

Если вы хотите наибольшее целое число, представленное строкой в ​​массиве 'a', вы можете написать' a.max_by (&: to_i) # => "542" '. –

ответ

1

Поскольку это массив строк, вы должны преобразовать элементов к числам.

["4", "5", "29", "54", "4", "0", "-214", "542", "-64", "1", "-3", "6", "-6"].map(&:to_i).max 
=> 542 

ruby ​​сравнение слов символов по значению ASCLL.

"6" > "542" 
=> true 

Вы можете получить значение ASCll характера по each_byte:

"".each_byte { |e| puts e }  
49 
50 
51 
52 
53 
54 
55 
56 
57 
+0

Спасибо за разъяснение pangpang! – RonCode

1

Это массив строк, поэтому он рассматривается как будто это алфавитный против числовыми. Это означает, что точно так же, как "za" придет после "azzzzzzz", "6" приходит после (больше) "5". Аналогичным образом, "51" поступит после "5" таким же образом "ab" придет после "a" и так далее.

1

Строки сравниваются с Lexicographical order.

Вы можете использовать Enumerable#max_by, чтобы указать, как их сравнивать:

["4", "5", "29", "54", "4", "0", "-214", "542", "-64", "1", "-3", "6", "-6"].max_by(&:to_i) 
#=> "542"