お題
- (1)
"Ruby is an object oriented programming language"
という文字列に含まれる各単語を要素とする配列を作れ - (1)の配列をアルファベット順にソートせよ
- (2)の配列を大文字と小文字の区別をせずにアルファベット順にソートせよ
- (1)の文字列の各文字(単語ではない)をそれぞれカウントせよ
回答
splitメソッドで配列に分割。
str = %q(Ruby is an object oriented programming language) str.split(' ') => ["Ruby", "is", "an", "object", "oriented", "programming", "language"]
アルファベット順にソート。
str.split(' ').sort => ["Ruby", "an", "is", "language", "object", "oriented", "programming"]
大文字と小文字の区別をせずにアルファベット順にソート。
str.split(' ').sort { |a, b| a.downcase <=> b.downcase } => ["an", "is", "language", "object", "oriented", "programming", "Ruby"]
文字列の各文字(単語ではない)をそれぞれカウント。
ary = str.chars hash = Hash.new(0) ary.each { |n| hash[n] += 1 } p hash => {"R"=>1, "u"=>2, "b"=>2, "y"=>1, " "=>6, "i"=>3, "s"=>1, "a"=>4, "n"=>4, "o"=>3, "j"=>1, "e"=>4, "c"=>1, "t"=>2, "r"=>3, "d"=>1, "p"=>1, "g"=>4, "m"=>2, "l"=>1}
引用:たのしいRuby 第6版 P.324より
学び
split
単純にsplitだけで良かった。
str.split(' ') → str.split
sort
sort_byだともっとシンプルに書けた。 sortメソッドは昇順がデフォルトなので、アルファベットは自動でアルファベット順にソートされる。各要素を小文字にしてソートすればいい。
str.split(' ').sort { |a, b| a.downcase <=> b.downcase } → str.split(' ').sort_by { |a| a.downcase }
最後の各単語に関しては以前にやったので説明は省略(DRYの原則につき)。