その他
    ホーム 技術発信 DoRuby 配列同士のinclude
    配列同士のinclude
     

    配列同士のinclude

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    プログラムを書いていて少し迷ったことがあったので書いていきます。

    arr_1 = [1, 2, 4, 5, 5, 8, 9]
    arr_2 = [2, 5, 8]
    

    arr_1の中のものからいくつか選んだものがarr_2に入っている」という状態で、
    arr_2arr_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
    

    一件落着です。