異なるファイルに格納されているさまざまな文字列の数を取得したいとします。実際には2種類のカウントが必要です。文字列strの場合、Rubyでバイナリ検索ツリーを使用して文字列を取得する
1.)すべてのファイルで文字列strの出現回数の合計。 2.)文字列strを持つファイルの数。
以下は私の総数を得ることができた私のルビーコードです。 しかし、私はファイル数を得ることができません。私は単純化のためにファイルの代わりに(ファイルに似た)配列とインスタンス変数 'flag'を使用しました。
私の考えは、flag = 0の場合、最初の配列で初めて文字列が検出されたことを意味します。したがって、filecount(またはこの場合はarraycount)がインクリメントされ、flagは1に設定されます。同じ文字列が同じ配列内にある場合、flagはすでに1に設定されていて何も起こりません。 配列が終了すると、すべてのフラグ値が0に戻されます。(私はそうだと思います)
しかし、何かが期待どおりに機能していません。前もって感謝します..!
class Tree
attr_accessor :left
attr_accessor :right
attr_accessor :data
attr_accessor :count
attr_accessor :flag
attr_accessor :howmanyfiles
def initialize(x=nil)
@left = nil
@right = nil
@data = x
@count = 1
@flag = 0
@howmanyfiles = 1
end
def search(x)
if self.data == x
self.count = self.count + 1
if self.flag == 0
self.howmanyfiles = self.howmanyfiles + 1
end
return "#{self.data} found" #self
else
ltree = left != nil ? left.search(x) : nil
return ltree if ltree != nil
rtree = right != nil ? right.search(x) : nil
return rtree if rtree != nil
end
nil
end
def insert(x)
list = []
if @data == nil
@data = x
self.flag = 1
elsif @left == nil
@left = Tree.new(x)
self.flag = 1
elsif @right == nil
@right = Tree.new(x)
self.flag = 1
else
list << @left
list << @right
loop do
node = list.shift
if node.left == nil
node.insert(x)
break
else
list << node.left
end
if node.right == nil
node.insert(x)
break
else
list << node.right
end
end
end
end
def traverse()
list = []
yield @data
list << @left if @left != nil
list << @right if @right != nil
loop do
break if list.empty?
node = list.shift
yield node.data
list << node.left if node.left != nil
list << node.right if node.right != nil
end
end
end
items = ["Amal","Hai", "Bob", "Bob", "Cat", "Cat", "Amal", "Dog", "Rizu", "Zol","Amal"]
tree = Tree.new
items.each {|x|
if tree.search(x) == nil
tree.insert(x)
end}
ObjectSpace.each_object(Tree) do |obj|
obj.flag = 0
end
items1 = ["Amal","wet", "jjj", "Cat"]
items1.each {|x|
if tree.search(x) == nil
tree.insert(x)
end}
ObjectSpace.each_object(Tree) do |obj|
obj.flag = 0
end
items2 = ["aa","Amal", "jjj"]
items2.each {|x|
if tree.search(x) == nil
tree.insert(x)
end}
ObjectSpace.each_object(Tree) do |obj|
puts obj.data.to_s + " " + obj.count.to_s + " " + obj.howmanyfiles.to_s
end
tree.traverse {|x| print "#{x} "}
print "\n"
OUTPUT - ArrayCount
aa 1 1
jjj 2 2
wet 1 1
Zol 1 1
Rizu 1 1
Dog 1 1
Cat 3 2
Bob 2 2 <--Bob is only present in first array but still output says 2.
Hai 1 1
Amal 5 3
Amal Hai Bob Cat Dog Rizu Zol wet jjj aa
あなたが発生しているエラーは何ですか?予想される出力とは対照的に、プログラムのスタックトレースまたは出力を共有できますか? – Sinstein
文字列Bobを持つ配列の数が間違っています。 ご覧のとおり、1つの配列にはBobがありますが、出力リストの数は2になります。 –
ここでのインデントはちょっと混乱しています。明確にコミュニケーションの意思を伝えるのに役立つように質問するときは、コードを可能な限り整理してください。 – tadman