2008-03-05[n年前へ]
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)"と書くのですね。