hirax.net::Keywords::「破壊的」のブログ



2010-01-06[n年前へ]

重複部分がある1次元データを繋ぐメソッドをRubyのArrayクラスに追加する 

重複部分がある1次元データを繋ぐメソッドを、RubyのArrayクラスに追加するコードを書いてみました。どういう機能かと言うと、たとえば、[1,2,3,4,5]というデータと[2,3,4,5,6]というデータがあったとしたら、それらの重複部分(同じものを示していると考えられる部分(すなわち[2,3,4,5])を重ね・重複しないように繋ぎ、[1, 2, 3, 4, 5, 6]というデータを出力するという機能です。

 だから、そのメソッド"connect"を使うと、たとえば、

require 'pp'
pp [1,2,3,4,5,6,"a","b",6].connect([6,"a","b",6,"3"])
a=[1,2,3,4,5].connect!([2,3,4,5,6])
pp a
なんていうコードを書くことができます。そして、その結果、
[1, 2, 3, 4, 5, 6, "a", "b", 6, "3"]
[1, 2, 3, 4, 5, 6]
という出力がされます。

 注意事項は、a.connect(b)というコードを書くときには、a.length>=b.lengthである必要があります。また、1次元のArrayを念頭に書いてあります。

 というわけで、適当に書いたArrayクラスの拡張コードは下記のような具合です。

class Array
  
  def connect(another)
    ret=nil
    if self.length!=0
      aLength=another.length
      lastElements=self[self.length-aLength..self.length]
      aNum=0
      aLength.times do |num|
        diff=0
        (aLength-num).times do |i|
          begin
            diff+=1 if lastElements[i+num]!=another[i]
          rescue
            diff+=1
          end
        end
        aNum=num
        break if diff==0
      end
      ret=self+another[(aLength-aNum)..aLength]
    else
      ret=another
    end
    ret
  end

  def connect!(another)
    self.replace(self.connect(another))
  end
  
end
 こんな機能を使う人はいないような気もしますが、自分の手習いも兼ねてここにコードをメモしておきます。上記コードの場合で言うと、connect!のような破壊的メソッドをを書くときには、"self=hoge"ではなく、"self.replace(hoge)"と書くのですね。



■Powered by yagm.net