Hoe alfabetiseer ik een array waarbij ik hoofdletters negeer?

Ik gebruik Leer om te programmeren van Chris Pine en ben stomverbaasd over zijn relatief eenvoudige uitdaging om gebruikersinvoer in de vorm van een lijst met willekeurige woorden te nemen en deze vervolgens in een array te alfabetiseren. Er zijn al eerder vragen over deze uitdaging gesteld, maar ik heb mijn specifieke vraag niet op SO kunnen vinden, dus het spijt me als het een duplicaat is.

puts "Here's 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

Hoewel dit werkt, probeer ik erachter te komen hoe ik de array alfabetisch kan rangschikken zonder hoofdlettergevoeligheid. Dit is moeilijk om mijn hoofd rond te wikkelen.
Ik heb geleerd over casecmpmaar dat lijkt een methode te zijn om een ​​specifieke string te vergelijken, in tegenstelling tot een array van strings.

Tot nu toe heb ik dingen geprobeerd als:

wordlist.to_s.downcase.to_a.sort!

wat er niet alleen slecht uitziet, maar ook om meerdere redenen niet werkt, waaronder het feit dat Ruby 2.0 niet toestaat dat strings worden geconverteerd naar arrays.


Antwoord 1, autoriteit 100%

Wat dacht je van:

wordlist.sort_by { |word| word.downcase }

Of nog korter:

wordlist.sort_by(&:downcase)

Antwoord 2, autoriteit 4%

Over het algemeen is sort_by niet efficiënt voor sleutels die eenvoudig te berekenen zijn. Een efficiëntere vergelijking is om sorteren te gebruiken met een blok en de standaardvergelijkingsoperator <=> te vervangen. met casecmp

wordlist.sort { |w1, w2| w1.casecmp(w2) }

Raadpleeg voor meer informatie over efficiëntiewinsten de officiële Ruby-documentatie voor de sort_by-methode: http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by


Antwoord 3

Ik had dezelfde vraag tijdens mijn Ruby-codeerbootcamp. Dit is wat voor mij werkte:

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

Other episodes