How do I alphabetize an array ignoring case?

RubyAlphabetical Sort

Ruby Problem Overview


I'm using Chris Pine's Learn to Program and am stumped on his relatively simple challenge to take user input in the form of a list of random words and then alphabetize them in an array. Questions about this challenge have come up before, but I haven't been able to find my specific question on SO, so I'm sorry if it's a duplicate.

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

While this does the trick, I'm trying to figure out how to alphabetize the array without case-sensitivity. This is hard to wrap my head around. I learned about casecmp but that seems to be a method for comparing a specific string, as opposed to an array of strings.

So far I've been trying things like:

wordlist.to_s.downcase.to_a.sort!

which, in addition to looking bad, doesn't work for multiple reasons, including that Ruby 2.0 doesn't allow strings to be converted to arrays.

Ruby Solutions


Solution 1 - Ruby

How about:

wordlist.sort_by { |word| word.downcase }

Or even shorter:

wordlist.sort_by(&:downcase)

Solution 2 - Ruby

In general, sort_by is not efficient for keys that are simple to compute. A more efficient comparison is to use sort with a block and replace the default comparison operator <=> with casecmp

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

For more information about efficiency gains, consult the official Ruby documentation for the sort_by method: http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

Solution 3 - Ruby

I had the same question at my Ruby coding bootcamp. Here's what worked for me:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser2608684View Question on Stackoverflow
Solution 1 - RubypguardiarioView Answer on Stackoverflow
Solution 2 - RubySimon KaczorView Answer on Stackoverflow
Solution 3 - RubyGalacticPlasticView Answer on Stackoverflow