Подтвердить что ты не робот

Как перечислить массив, игнорирующий регистр?

Я использую 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 не позволяет преобразовывать строки в массивы.

4b9b3361

Ответ 1

Как насчет:

wordlist.sort_by { |word| word.downcase }

Или даже короче:

wordlist.sort_by(&:downcase)

Ответ 2

В общем случае 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

Ответ 3

У меня был такой же вопрос на моем рубиновом кодировании Ruby. Вот то, что сработало для меня:

puts "Type in a sentence."
sentence = gets.chomp.downcase
puts sentence.split(" ").sort