Ответ 1
Как насчет:
wordlist.sort_by { |word| word.downcase }
Или даже короче:
wordlist.sort_by(&:downcase)
Я использую Chris Pine Learn to Program, и я нахожусь в тупике относительно его относительно простой задачи взять пользовательский ввод в виде списка случайных слов, а затем упорядочить их по алфавиту в массиве. Вопросы об этой проблеме возникли раньше, но я не смог найти свой конкретный вопрос на SO, поэтому мне жаль, если это дубликат.
puts "Here a fun trick. Type as many words as you want (one per line) and
I'll sort them in...ALPHABETICAL ORDER! Hold on to your hats!"
wordlist = Array.new
while (userInput = gets.chomp) != ''
wordlist.push(userInput)
end
puts wordlist.sort
В то время как это делает трюк, я пытаюсь выяснить, как в алфавитном порядке массива без чувствительности к регистру. Это трудно обернуть вокруг меня.
Я узнал о casecmp
, но это похоже на метод сравнения конкретной строки, в отличие от массива строк.
До сих пор я пробовал такие вещи, как:
wordlist.to_s.downcase.to_a.sort!
который, помимо плохого, не работает по нескольким причинам, в том числе, что Ruby 2.0 не позволяет преобразовывать строки в массивы.
Как насчет:
wordlist.sort_by { |word| word.downcase }
Или даже короче:
wordlist.sort_by(&:downcase)
В общем случае sort_by не эффективен для ключей, которые просто вычислить. Более эффективное сравнение заключается в использовании сортировки с блоком и замене оператора сравнения по умолчанию <= > с помощью casecmp
wordlist.sort { |w1, w2| w1.casecmp(w2) }
Для получения дополнительной информации об эффективности повышения эффективности обратитесь к официальной документации Ruby для метода sort_by: http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by
У меня был такой же вопрос на моем рубиновом кодировании Ruby. Вот то, что сработало для меня:
puts "Type in a sentence."
sentence = gets.chomp.downcase
puts sentence.split(" ").sort