2013-11-19 2 views
-1

Может ли кто-нибудь объяснить, почему "time" - это максимальное значение здесь?Как анализировать метод «max»

my_array = %w{hello my time here is long} 
my_array.max #=> "time" 
+1

Документов есть ответ: http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-max и http://ruby-doc.org/core- 2.0.0/String.html # method-i-3C-3D-3E –

+0

["лексикографическая сортировка"] (http://en.wikipedia.org/wiki/Lexicographic_order); см. также ['Enumerable # max_by'] (http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-max_by). – Phrogz

+1

Получите привычку проверять подобные вещи в irb. –

ответ

2

Поскольку в алфавитном порядке t в time больше здесь, среди других в массиве my_array.

Вот один из способов, как произошло сравнение строк:

'hello' > 'time' # => false 
'my' > 'time' # => false 
'here' > 'time' # => false 
'is' > 'time' # => false 
'long' > 'time' # => false 

Чтобы понять выходы выше фрагмент кода, вы должны должны видеть String#<=> документации. Поскольку ваш my_array содержит все экземпляры строк, которые вызвали метод <=>, чтобы построить вывод max.

Documentations говорит Enumerable#max:

перечислимых # макс, без блока предполагает, что все объекты реализации Comparable.

+0

Ahhh спасибо !!! Теперь имеет смысл ... – user3007294

+0

«больше» - это, вероятно, не то слово, которое вы имели в виду. «больше» будет более корректно относиться к сопоставлениям символов. –

0

Вот как компьютеры смотрят на строки и сравнивают их.

Если мы посмотрим на первые символы каждого слова, это поможет немного, потому что мы знаем, как алфавит заказывает письма:

%w[hello my time here is long].map{ |s| s[0] }.sort # => ["h", "h", "i", "l", "m", "t"] 

Но это не помогает визуализировать его, так вот посмотрите на письма каждого слова, как компьютер видит их:

%w[time tome].each do |w| 
    puts w.chars.map(&:ord).join(', ') 
end 
# >> 116, 105, 109, 101 
# >> 116, 111, 109, 101 

Каждая буква имеет значение. За эти годы было много разных способов упорядочивания букв для компьютера, что заставило персонажа оценивать отображение для изменения. EBCDIC и ASCII были самыми популярными, но имеют разные заказы. Обычно мы имеем дело с ASCII или производным, установленным ОС.

Посмотрите, как символы в словах представлены значениями на следующем выходе. Это должно облегчить понимание того, что делает компьютер.

%w[he hello help holler hollow].sort.each do |w| 
    puts '"%6s": %s' % [ w, w.chars.map(&:ord).join(', ') ] 
end 
# >> " he": 104, 101 
# >> " hello": 104, 101, 108, 108, 111 
# >> " help": 104, 101, 108, 112 
# >> "holler": 104, 111, 108, 108, 101, 114 
# >> "hollow": 104, 111, 108, 108, 111, 119 
Смежные вопросы