バリケンのRuby日記 RSSフィード

2006-06-04

[] リスト構造の要素から、条件を満たす要素を取り出す  リスト構造の要素から、条件を満たす要素を取り出す - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  リスト構造の要素から、条件を満たす要素を取り出す - バリケンのRuby日記  リスト構造の要素から、条件を満たす要素を取り出す - バリケンのRuby日記 のブックマークコメント

昨日エントリの続きだよ。

じゃあ、いよいよ「あるリスト構造に含まれる要素のうち、条件を満たす要素だけで構成されたリスト新たに生成する」というメソッドfind_allを定義してみるよ。

  def find_all(x)
    result = List.new
    self.each do |i|
      result.add_last(i) if x.call(i)
    end
    return result
  end

xには手続きオブジェクトを与えることで、条件を指定することにしたよ。ブロック付きメソッドのおかげで、Javaソースコードよりもずいぶんシンプルに書けたね。

じゃあ、1から6までの整数を要素として持つリストを作ってから、2の倍数と3の倍数を取り出すサンプルを作ってみよう!

class List
  def initialize
    @cdr = nil
    @car = nil
  end
  attr_accessor :cdr, :car

  def add_last(x)
    a = self
    a = a.car until a.car.nil?
    a.car = List.new
    a.car.cdr = x
  end

  def size
    a = self
    i = 0
    i += 1 while a = a.car
    return i
  end

  def each
    a = self.car
    self.size.times do
      yield a.cdr
      a = a.car
    end
  end

  def find_all(x)
    result = List.new
    self.each do |i|
      result.add_last(i) if x.call(i)
    end
    return result
  end
end

x = Proc.new {|a| a % 2 == 0 ? true : false }
y = Proc.new {|b| b % 3 == 0 ? true : false }

z = List.new
z.add_last(1)
z.add_last(2)
z.add_last(3)
z.add_last(4)
z.add_last(5)
z.add_last(6)

m = z.find_all(x)
n = z.find_all(y)

m.each do |i|
  puts i
end

puts

n.each do |i|
  puts i
end

実行結果だよ。

2
4
6

3
6

確かに2の倍数と3の倍数が取り出せたね。

追記:リファクタリングしていただきました。ありがとうございます!

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060604