web-dev-qa-db-fra.com

Comment alphabétiser un tableau en ignorant la casse?

J'utilise le programme Learn to Program de Chris Pine et je suis perplexe sur son défi relativement simple de prendre les entrées des utilisateurs sous la forme d'une liste de mots aléatoires, puis de les alphabétiser dans un tableau. Des questions sur ce défi ont déjà été posées, mais je n'ai pas pu trouver ma question spécifique sur SO, donc je suis désolé s'il s'agit d'un doublon.

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

Bien que cela fasse l'affaire, j'essaie de comprendre comment alphabétiser le tableau sans respecter la casse. C'est difficile d'envelopper ma tête. J'ai découvert casecmp mais cela semble être une méthode pour comparer une chaîne spécifique, par opposition à un tableau de chaînes.

Jusqu'à présent, j'ai essayé des choses comme:

wordlist.to_s.downcase.to_a.sort!

qui, en plus d'avoir l'air mauvais, ne fonctionne pas pour plusieurs raisons, y compris que Ruby 2.0 ne permet pas de convertir les chaînes en tableaux.

41
user2608684

Que diriez-vous:

wordlist.sort_by { |Word| Word.downcase }

Ou encore plus court:

wordlist.sort_by(&:downcase)
93
pguardiario

En général, sort_by n'est pas efficace pour les clés simples à calculer. Une comparaison plus efficace consiste à utiliser sort avec un bloc et à remplacer l'opérateur de comparaison par défaut <=> par casecmp

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

Pour plus d'informations sur les gains d'efficacité, consultez la documentation officielle Ruby pour la méthode sort_by: http://www.Ruby-doc.org/core-2.1.2/Enumerable. html # method-i-sort_by

3
Simon Kaczor

J'ai eu la même question à mon Ruby codage bootcamp. Voici ce qui a fonctionné pour moi:

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