この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
プログラムを書いていて少し迷ったことがあったので書いていきます。
arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 5, 8]
「arr_1
の中のものからいくつか選んだものがarr_2
に入っている」という状態で、arr_2
がarr_1
の中身の組み合わせで成り立っているかを調べる必要がありました。
rubyでは配列同士は「-
」演算子で差分を取れるのを知っていたので
(arr_2 - arr_1).empty?
このようにチェックをしようとしたのですがこのやり方だと…
arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 2, 2, 5]
arr_2 - arr_1
=> []
こんな感じに重複した値がすべて消し去られてしまいます。
自分の場合は重複したものも個別に判定する必要があったのでこれではまずいです。
どうせ便利なメソッドがあるだろうと探しましたが見当たらなかったので自分で作ることにしました。
class Array
def include_of_array(arr)
temp = self.dup
arr.each do |value|
idx = temp.index(value)
# 見つからなければ終了
return false if idx.blank?
temp.delete_at(idx)
end
return true
end
end
arr_1 = [1, 2, 4, 5, 5, 8, 9]
arr_2 = [2, 2, 2, 5]
arr_1.include_of_array(arr_2)
=> false
arr_1.include_of_array([1, 5, 5, 9])
=> true
一件落着です。