From: Interfecus Date: 2005-11-15T08:17:17+09:00 Subject: Re: Index and Query (#54) Hi, This is my first submitted solution. I only started learning ruby in my free time 4 days ago, so don't hold back the critique. I would really appreciate comments and suggestions on how I can get more clued in to the ruby style & conventions. I'm afraid it's a bit longer than the others, but I'm just learning :) class Catalogue def initialize(start_docs=[[]]) #Expects an array of [space-delimited keyword list, object to catalogue] arrays for each initial object @keywords = Array.new #Array of used keywords. Position is important. @cat_objects = Array.new #Array of [keyword bitfield, stored object] arrays start_docs.each do |st_doc| self.catalogue!(st_doc[0], st_doc[1]) end end def each_under_kw(keyword) #Expects a string keyword. Yields objects using that keyword. if cindex = @keywords.index(keyword.upcase) @cat_objects.each do |cat_obj| yield(cat_obj[1]) unless ((cat_obj[0] & (2 ** cindex)) == 0) end end end def each @cat_objects.each {|obj| yield obj[1]} end def catalogue!(keyword_list, cat_object) #Adds a new object to the catalogue. Expects a space-delimited list of keywords and an object to catalogue. key_bitfield = 0 split_list = keyword_list.upcase.split unless split_list.empty? split_list.each do |test_keyword| cindex = @keywords.index(test_keyword) if cindex == nil cindex = @keywords.length @keywords << test_keyword end key_bitfield |= 2 ** cindex end @cat_objects << [key_bitfield , cat_object] end end attr_accessor :cat_objects, :keywords end # Begin Demonstration # For this demonstration, the list of keywords itself is the object stored. # This does not have to be the case, any object can be stored. doc1 = "The quick brown fox" doc2 = "Jumped over the brown dog" doc3 = "Cut him to the quick" demo = Catalogue.new([[doc1, doc1], [doc2, doc2]]) #Create the catalogue with 2 objects demo.catalogue!(doc3, doc3) #Add an object to the catalogue print "All phrases:\n" demo.each do |obj| print obj + "\n" end print "\nList of objects with keyword 'the':\n" demo.each_under_kw('the') do |obj| print obj + "\n" end print "\nList of objects with keyword 'brown':\n" demo.each_under_kw('brown') do |obj| print obj + "\n" end print "\nList of objects with keyword 'dog':\n" demo.each_under_kw('dog') do |obj| print obj + "\n" end print "\nList of objects with keyword 'quick':\n" demo.each_under_kw('quick') do |obj| print obj + "\n" end #End Demonstration