LoginSignup
5
5

More than 5 years have passed since last update.

Rubyにおける入出力覚書

Last updated at Posted at 2019-02-14

入力

基本はgetsを利用。改行を削除する必要がある場合はgets.chompを使う必要がある。基本文字列として扱われるので、数字の場合はto_iメソッドを使う必要あり。文字列として受け取りたい場合はto_sを利用。

# スペース区切りで与えられた数字をリストに格納
numbers = gets.chomp.split.map(&:to_i)
# 個別の変数に格納する場合も同様(入力数が確定している必要あり)
a, b = gets.chomp.split.map(&:to_i)

その他必要に応じて調べたメソッドや処理方法

複数行に渡る入力を受け取る

先頭行に後に続く行数M、以下にM行の入力が与えられる場合。

# 例
3
1 2
2 3
3 4
m = gets.chomp.to_i
m.times do
  numbers = gets.chomp.split.map(&:to_i)
  p numbers
end

計算や確認用メソッドなど

2 ** 3 #=> 8 #累乗
0.zero? #=>true  #レシーバが0であるか
2.even? #=>true  #レシーバが偶数であるか
2.odd? #=>false  #レシーバが奇数であるか

四捨五入(丸め操作)

# 四捨五入する(桁数指定可)
puts 1.6.round  #=>2
puts 1.4.round  #=>1
puts 150.round(-2) #=>200
puts 1500.round(-2) #=>1500
puts 1500.round(-3) #=>2000
puts -1.5.round #=>-2

# 自身と等しいか、自身より大きい整数のうち最小のものを返す
puts 56.5.ceil #=>57

# 自身と等しいか、自身より小さい整数のうち最大のものを返す
puts 56.5.floor  #=>56

# 自身から0までの整数で、自身に最も近いものを返す
puts 22.2.truncate #=>22
puts -1.5.truncate #=>-1

配列操作

array.unshift("hoge")  #配列の先頭へ追加
array.push("hoge")  #配列の末尾へ追加
array.shift  #配列の先頭から削除
array.pop  #配列の末尾から削除
array1 += array2  #2つの配列の要素をつなげた配列を作る
array1 -= array2  #後ろの配列の要素を除いた配列を作る
array.uniq  #配列から重複した値を取り除く(新しい配列を返す)
array.uniq!  #破壊的に重複した値を取り除く(自分自身を変更)
array.sample  #配列内の要素をランダムに取得
array.shuffle  #配列内の要素をランダムに並び替え
array.sort  #配列内の要素を昇順に並び替え(小さい順、A→Z)
array.reverse  #配列内の要素を逆順にする
array.sort.reverse  #配列内の要素を降順に並び替え

条件に合う要素を抽出する(合うものがない場合空の配列が返る)

[1, 2, 3, 4, 5].select { |n| n % 2 == 0 } #=> [2, 4]
{:a => 1, :b => 2}.select { |k, v| v == 1 } #=> {:a => 1}

条件に合わない要素を抽出する(合うものがない場合空の配列が返る)

[1, 2, 3, 4, 5].reject { |n| n % 2 == 0 } #=> [1, 3, 5]
{:a => 1, :b => 2}.reject { |k, v| v == 1 } #=> {:b => 2}

条件に合う最初の要素を返す(ない場合はnilが返る)

[5, 4, 3, 2, 1].find{ |n| n % 2 == 0 } #=> 4
# 要素のインデックス番号を返す
[5, 4, 3, 2, 1].find_index{ |n| n % 2 == 0 } #=> 1

条件に合う要素の数を返す

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
puts numbers.count {|item| item % 2 == 0 } #=> 4

便利なやつ

array.each_slice(3).map.to_a  #配列の要素を指定数で分割する
"12345".chars.map(&:to_i)  #文字列を配列に分解
number.to_s.chars.map(&:to_i)  #数字を受け取って一桁ずつ配列に分解
# コメントでより良い方法を教えて頂きました
1024.digits #=> [4, 2, 0, 1]
1024.digits.reverse #=> [1, 0, 2, 4]

スライス

animals = ["dog", "cat", "mouse", "rabbit", "horse"]
p animals.slice(3)  #=> "rabbit"
p animals.slice(1, 3)  #=> ["cat", "mouse", "rabbit"]
p animals.slice(2..4)  #=> ["mouse", "rabbit", "horse"]

ループ処理

インデックス番号付きのループ

array.each_with_index do |a, i|
  puts "#{i}. #{a}"
end

ハッシュ操作

配列と使えるメソッドが重複することが多い。ハッシュ独自の物について。

hash.default = 0  #存在しないキーを取得しようとした際のnilを0に変更
hash3 = hash1.merge(hash2)  #hash1とhash2をまとめた新しいhash3を作る
hash.delete(:hoge)  #キーhogeと対の値を削除

繰り返し処理

#通常の繰り返し
hash.each do |key, value|
  puts "#{key} #{value}"
end

#キーのみ取り出し
hash.each_key do |key|  #ブロック変数は1つでいい
  puts key
end

#バリューのみ取り出し
hash.each_value do |value|  #ブロック変数は1つでいい
  puts value
end

mapの扱い

配列の各要素を変換するメソッド

result = [1, 2, 3].map do |x|
  x * 2
end
p result #=> [2, 4, 6]

後置if, unlessで行数削減

単純な条件の場合、if,unlessは処理の後に書くことで行数を削減できる。else等が必要な場合はちゃんと書く方がいい。

m = 1
puts "even" if m.even? #=> falseなので実行されない
puts "odd" unless m.even? #=> trueなので実行される

出力の時に使いがちなjoin

array.join  #リスト内の要素を連結
array.join("hoge")  #リスト内の要素に引数を挟んで連結
["hoge", "fuga", "piyo"].join(" ") #=> hoge fuga piyo
5
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5