注意
paizaのレベルアップ問題集のネタバレあり。
メソッドの基本
Rubyにおいては、メソッド呼び出しはドット(.)でつなぐことができます。
これは、一つのオブジェクトに対して、複数のメソッドを順次適用することができることを意味しています。これをメソッドチェーン(Method Chaining)と呼びます。
uniqメソッド(精査中)
Rubyの配列(Array)やハッシュ(Hash)などのオブジェクトに対して、重複する要素を除去するためのメソッドが uniq メソッドです。
uniq メソッドは、元の配列やハッシュを変更するのではなく、新しい配列やハッシュを返します。重複する要素は、最初に出現した要素が残され、それ以降の要素はすべて削除されます。
例えば、以下のように配列 a に重複する要素が含まれている場合に、 a.uniq を実行すると、重複する要素が除去された新しい配列が生成されます。
ruby
Copy code
a = [1, 2, 3, 2, 1]
b = a.uniq
puts b # [1, 2, 3]
また、 uniq メソッドには、ブロックを渡すことができます。この場合、ブロックの戻り値が重複判定に使用されます。つまり、同じブロックの戻り値を持つ要素は重複していると見なされ、最初に出現した要素だけが残されます。
例えば、以下のように文字列の配列 a に対して、文字列の長さを判定するブロックを渡した場合に、 a.uniq を実行すると、文字列の長さが同じ要素が除去された新しい配列が生成されます。
ruby
Copy code
a = ["aaa", "bb", "cccc", "dd"]
b = a.uniq {|x| x.length }
puts b # ["aaa", "bb", "cccc"]
uniqメソッド実装してみた(仮)
airport = ["HND", "NRT", "KIX", "NGO", "NGO"]
# puts airport
# puts airport[0]
airport_num = airport.length
# puts airport_num
for i in 0..airport_num
# puts airport[i]
end
count_true = 0
# count_false = 0
for i in 0..airport_num
for j in i + 1..airport_num
if airport[i] == airport[j]
# puts "true"
count_true = count_true + 1
# puts count_true
# else
# puts "false"
# count_false = count_false + 1
# puts count_false
end
end
end
if count_true >= 1
puts "true"
else
puts "false"
end
sizeメソッドとlengthメソッド(精査中)
・size メソッドは、配列や文字列の要素数を取得するためによく使われます。また、length メソッドという同じ機能のメソッドもありますが、size メソッドと同じく要素数を返すため、両者はほぼ同じです。
Rubyの配列(Array)や文字列(String)などのオブジェクトには、size メソッドと length メソッドの2つのメソッドが用意されています。両者は基本的に同じ機能を持っていますが、微妙な違いがあります。
主な違いは以下の通りです。
size メソッドは、要素数を返すメソッドであり、配列の要素数や文字列の長さを取得するために使用されます。
length メソッドは、文字列の場合には size と同じく文字数を返し、配列の場合には size と同じく要素数を返します。ただし、BigDecimal クラスのオブジェクトなど、一部のオブジェクトでは size と length が異なる値を返すことがあります。
つまり、配列や文字列などの要素数を取得する場合は、size メソッドを使用することが一般的ですが、文字列の場合には length メソッドを使用することもできます。ただし、どちらを使用しても問題はありません。
一方、数値や BigDecimal クラスのオブジェクトなど、要素数と文字数が異なる場合には、length メソッドでは正しい値を取得できないことがあるため、size メソッドを使用することが推奨されます。
BigDecimalとは、Rubyの標準ライブラリに含まれるクラスの一つで、任意精度の小数点数を扱うためのクラスです。
通常の浮動小数点数では、桁数が大きくなると誤差が生じることがありますが、BigDecimalはそのような誤差を回避することができます。また、財務などで精度が重要な計算に使用することができます。
BigDecimalは、通常の数値リテラル(整数や浮動小数点数)をそのまま使うことができますが、少し特殊な書式で表現することもできます。たとえば、以下のように表現します。
ruby
Copy code
require 'bigdecimal'
a = BigDecimal('0.1')
b = BigDecimal('0.2')
c = a + b
puts c # 0.3
また、BigDecimalクラスは、多くの数学的な演算子をサポートしています。たとえば、次のように演算を行うことができます。
ruby
Copy code
a = BigDecimal('0.1')
b = BigDecimal('0.2')
c = a + b # 加算
d = a - b # 減算
e = a * b # 乗算
f = a / b # 除算
puts c # 0.3
puts d # -0.1
puts e # 0.02
puts f # 0.5
BigDecimalは、Rubyの標準ライブラリに含まれているため、通常のRubyと同じように利用することができます。
sortメソッド
# 昇順にソート
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_arr = arr.sort
p sorted_arr #=> [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
# 降順にソート
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_arr = arr.sort { |a, b| b <=> a }
p sorted_arr #=> [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
メモ
{ |a, b| b <=> a }は、ブロックを表します。このブロックは、要素aと要素bを比較し、その結果を返します。<=>演算子は、比較演算子の1つであり、左辺が右辺より小さい場合には負の数、等しい場合には0、大きい場合には正の数を返します。
このブロックでは、要素bと要素aを比較しています。このため、配列を降順にソートすることができます。具体的には、b <=> aが正の数であれば、bはaよりも大きいため、bが前にくるように配列がソートされます。同様に、b <=> aが負の数であれば、bはaよりも小さいため、bが後ろにくるように配列がソートされます。
以下は、<=>演算子を使用した比較の例です。
a = 3
b = 5
puts a <=> b #=> -1
a = 5
b = 5
puts a <=> b #=> 0
a = 5
b = 3
puts a <=> b #=> 1
上記の例では、<=>演算子は、数値の大小を比較しています。a <=> bが負の数であるため、aはbよりも小さいと判断されています。
sortメソッド実装してみた。
n = gets.chomp.to_i
# puts n
as = gets.split(' ')
# puts as
a = Array.new(n) #ここ
for i in 0..n - 1 #ここ
a[i] = as[i].to_i
end
for i in 0..n - 1 #ここ
for j in i + 1..n - 1 #ここ
if a[i] > a[j]
tmp = a[i]
a[i] = a[j]
a[j] = tmp
end
end
end
for i in 0..n - 1 #ここ
puts a[i]
end
timesメソッド
・整数の数だけ繰り返し処理をするメソッド。
3.times do |i|
puts "Hello, world! #{i+1}"
end
実行結果
Hello, world! 1
Hello, world! 2
Hello, world! 3
メモ
・timesメソッドと間違えてtimeを調べたらメソッドではなくてTimeはクラス。
・例えばputs Time.nowで実行したら現在時刻が出力される。
timesメソッド実装してみた。
n = gets.chomp.to_i
for i in 1..n
s, d = gets.chomp.split(' ')
puts d
end
eachメソッド
・繰り返し処理を行うための方法。
理解しているところ(ここの理解を育成中)
・forは制御構文であり、メソッドではない。
・eachはメソッドである。
eachメソッドを実装してみた(仮)
s = gets
# puts s
for i in 0..s.length
puts s[i]
end
chomp
・改行文字を取り除いてくれるメソッド
s = gets.chomp
# puts s
puts s.length
count
・指定した要素が配列、ハッシュ、文字列の中にいくつ含まれているかを数えるために使用されます。
配列
Copy code
fruits = ["apple", "banana", "orange", "banana", "kiwi"]
puts fruits.count("banana") # => 2
puts fruits.count("lemon") # => 0
puts fruits.count # => 5
ハッシュ
Copy code
person = { name: "Alice", age: 30, height: 170, weight: 60 }
puts person.count # => 4
puts person.count { |k, v| v > 50 } # => 3
文字列
Copy code
string = "Hello, World!"
puts string.count("lo") # => 5
puts string.count("l") # => 3
puts string.count("L") # => 0
配列やハッシュに対して、引数を指定しない場合は、要素数を返します。ハッシュに対して、ブロックを渡すこともできます。この場合、ブロックにはキーと値が渡され、ブロックの戻り値が真となる要素の数を返します。
文字列に対して、引数として指定した文字列の中で含まれている文字の数を返します。また、引数を指定しない場合は、文字数を返します。
countメソッド実装してみた。
c = gets.chomp
# puts c
s = gets.chomp
# puts s
count = 0
for i in 0..s.length-1
if c == s[i]
count = +1
end
end
puts count
memo
・C言語はcount++って書けるけどRubyはcount = +1って書く。Rubyにインクリメント演算子はない。
upcase
小文字を大文字にしてくれるメソッド
str = "hello, world"
str_upcase = str.upcase
puts str_upcase
実行結果
HELLO, WORLD
downcase
大文字を小文字にしてくれるメソッド
str = "HELLO, WORLD"
str_downcase = str.downcase
puts str_downcase
実行結果
hello, world
メモ
downcaseメソッドもupcaseメソッド同様、元の文字列自体を変更するのではなく、新しい文字列を返します。そのため、上記の例ではstr変数の値は変更されず、str_downcase変数に小文字に変換された文字列が格納されます。