日別アーカイブ: 2022年10月9日

TIPS(Ruby:文字列+数値を数値の昇順にソートする)

目標:なにがしたいか?

文字列+数値を数値の昇順にソートする

問題

とある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番目の数値を基準にして昇順に並び替えている。