目標:なにがしたいか?
文字列+数値を数値の昇順にソートする
問題
とあるWebサービスのユーザー ID は「ユーザーネーム + シリアルナンバー」となります。
例えば、satouさんが1番目に登録した場合、ユーザー ID は「satou1」、
suzukiさんが 1081 番目に登録した場合、ユーザー ID は「suzuki1081」になります。
いま、この Webサービスに登録しているユーザーのうち N 人のユーザー ID が与えられるので、それらを番号の若い(小さい)順に並べて出力してください。
- 条件
- ・1 行目にユーザー ID の個数を表す整数 N が与えられます。(1 ≦ N ≦ 200)
・名前は全て英小文字のみからなります
・シリアルナンバーは全て 1 以上 100 以下の整数で、先頭に不要な 0 を含みません。
・シリアルナンバーはユニークなので同じ番号はないです。与えられる入力値
5 satou1 suzuki1081 tanaka990 yamada100 kawase1001
期待する出力
satou1 yamada100 tanaka990 kawase1001 suzuki1081
コードと解説
#入力値(数値)を受け取る n = gets.to_i #空の配列を作成する ary,answer = [],[] #n回繰り返す n.times do |i| #2行名以降の入力値を文字列として受け取る user_id = gets.chomp #数字の手前で2つに分割する user_id = user_id.split(/(?=\d)/,2) #分割したものの数字が文字列のままなので数値に変換する user_id[1] = user_id[1].to_i #空の配列aryにuser_idを格納していく ary << user_id end #配列を数字の昇順に並び替える ary = ary.sort_by{ |_, number| number } #文字列と数字を繋げて1行ずつ出力 n.times { |i| puts ary[i].join }
https://paiza.io/ja/projects/new
↑こちらにコピペして「実行」で確認できます。
↓このような出力結果になっていればOKです。
※ ary = ary.sort_by{ |_, number| number }がポイント
[["satou", 1], ["suzuki", 1081], ["tanaka", 990], ["yamada", 100], ["kawase", 1001]]
配列の0番目の文字列で並び替えずに
配列の1番目の数値を基準にして昇順に並び替えている。