web-dev-qa-db-ja.com

大文字小文字を無視して配列をアルファベット順に並べるにはどうすればよいですか?

私はChris PineのLearn to Programを使用しており、ランダムな単語のリストの形式でユーザー入力を取得し、それらを配列にアルファベット順に並べるという彼の比較的簡単な挑戦に困惑しています。このチャレンジに関する質問は以前に出てきましたが、SOで特定の質問を見つけることができなかったため、重複している場合は申し訳ありません。

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

これはトリックを行いますが、大文字と小文字を区別せずに配列をアルファベット順にする方法を見つけようとしています。これは私の頭を包むのが難しいです。 casecmpについて学びましたが、それは文字列の配列ではなく、特定の文字列を比較する方法のようです。

これまで私は次のようなことを試みてきました:

wordlist.to_s.downcase.to_a.sort!

見栄えが悪いことに加えて、Ruby 2.0では文字列を配列に変換できないなど、複数の理由で機能しません。

41
user2608684

どうですか:

wordlist.sort_by { |Word| Word.downcase }

またはさらに短く:

wordlist.sort_by(&:downcase)
93
pguardiario

一般に、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
Simon Kaczor

Rubyブートキャンプのコーディングで同じ質問がありました。

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