【Ruby】木構造を定義してみる 2
こんにちは、しきゆらです
前回の記事で木構造を作るプログラムを書きましたが、子ノードの追加がわかりにくかったのですこし変更しました
なんで、前回の追加の仕方だったのかなどを合わせてメモしておきます
変更したコード
まずはコードを
Nodeクラス
class Node
attr_accessor :value, :parent, :child
def initialize(value, parent=nil)
@value = value
@child = []
@parent = parent
end
def ==(node)
@value == node.value
end
# 兄弟要素を返す
def brothers
unless @parent.nil? then
@parent.child
else
nil
end
end
# 子要素を追加
def add_child!(value)
@child.push(Node.new(value, self))
end
def to_s
unless @parent.nil? then
'value: ' + @value
else
'root'
end
end
def search(value)
# task_nameが一致するものを探す
# この書き方だと、タテ型探索
if @value == value then
return self
else
@child.each do |n|
node = n.search(value)
if node then
return node
end
end
return nil
end
end
def search_brothers(node)
search(node.parent.task_name)
end
end
変更した部分はadd_child!のところ
def add_child!(value)
@child.push(Node.new(value, self))
endちなみに、前回のadd_child!はこんな感じでした
def add_child!(node)
if self == node.parent then
@child.push(node)
else
@child.each do |n|
n.add_child!(node)
end
end
endとてもスッキリしました
ファイル読み込み関数
def make_tree(file_path)
node = Node.new
childs = []
File.open(file_path).each_line do |lines|
lines = lines.chomp.split(',')
next if lines[0] == 'value'
parent = lines.last
value = lines.first
p_node = node.search(parent)
p_node.add_child!(value)
end
return node
end
ちなみに、前回のものは以下の通り
def make_tree(file_path)
node = Node.new
childs = []
File.open(file_path).each_line do |lines|
lines = lines.chomp.split(',')
value = lines.first
next if lines[0] == 'value'
if lines.last == 'root' then
t = Node.new(value, node)
node.add_child!(t)
childs.push(t)
else
childs.each do |n|
if n.value == lines.last then
tmp = Node.new(value, n)
node.add_child!(tmp)
childs.push(tmp)
break
end
end
end
end
return node
end
こちらも短くなりました
どうして前回の書き方だったのか
前回は、こう考えていました
最上位ノードが複数あるので、rootノードを最上位ノードの親ノードとしたいのでrootノードに子供を追加していかなければいけない
そして、作成するノードの親ノードもNodeクラスにしなければいけない
ということで、作成したノードを保持しておき一致したものを親ノードとしていけばいい、と
しかし、よくよく考えればmake_tree内でNode.newしないで
add_child!内でNode.newし、親要素としてselfを渡してやればいいということで
add_child!にはそのノードが持つ値valueを渡すように変更しました
この変更により、コードが短くなり流れがわかりやすくなったかと思います
今後もこれを使っていくので、どこかで変更したら追加で記事を書いていこうと思います
おわり


ディスカッション
コメント一覧
まだ、コメントがありません