Ich möchte die Anzahl der verschiedenen Strings in verschiedenen Dateien erhalten. Eigentlich brauche ich zwei Arten von Zählungen. Für eine Zeichenfolge str,Anzahl der Strings mit Binary Search Tree in Ruby erhalten
1.) Gesamtzahl der Vorkommen der Zeichenfolge str in allen Dateien. 2.) Anzahl der Dateien mit der Zeichenfolge str.
Unten ist mein RUBY Code dafür, in dem ich es geschafft habe, die Gesamtzahl zu bekommen. Aber ich kann die Datei nicht zählen. Ich habe Arrays anstelle von Dateien zur Vereinfachung (analog zu Dateien) und eine Instanzvariable 'Flag' verwendet.
Mein Konzept ist, dass, wenn Flag = 0, bedeutet, dass die Zeichenfolge zum ersten Mal im ersten Array auftritt. Daher wird der Dateicount (oder Arraycount in diesem Fall) inkrementiert und flag wird auf 1 gesetzt. Wenn also dieselbe Zeichenfolge im selben Array erscheint, ist Flag bereits auf 1 gesetzt und nichts passiert. Wenn ein Array vorbei ist, werden alle Flag-Werte auf 0 gesetzt zurück (ich glaube so)
Aber etwas funktioniert nicht wie erwartet. Danke im Voraus..!
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 - in Format String TOTAL_COUNT 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
Was ist der Fehler, den Sie stoßen? Könnten Sie den Stack-Trace oder die Ausgabe des Programms im Gegensatz zur erwarteten Ausgabe teilen? – Sinstein
Meine Anzahl für die Anzahl der Arrays mit der Zeichenfolge Bob ist falsch. Wie Sie sehen können, hat nur ein Array Bob, aber die Anzahl der Ausgabelisten beträgt 2. –
Einrückung hier ist ein wenig durcheinander. Versuchen Sie, Ihren Code so strukturiert wie möglich zu halten, wenn Sie Fragen stellen, da Klarheit hilft, die Absicht zu kommunizieren. – tadman