From: "Abinoam Jr." Date: 2011-01-17T13:23:23+09:00 Subject: Re: Ruby iterative depth. Hi Marcello, Sorry, but I was not able to figure out exactly how this piece of code is trying to generate your desired outcome. (my fault!) If you're just willing to represent the data in a kind o hierarchical tree, there's a lot of "Ruby way" to do that. It seams (in my humble opinion) that you're trying to do it in "C" way, or something like that. But, I can give you some tips. See comments in the code. # You shouldn't need to define methods outside the object scope (like the one bellow). # Métodos busca em profundidade iterativo def menu_iterative(menu) res = [] # When shifting the first element you're assuming the Array is in a kind of order, # and the first element is the "root". Is this always true? el1 = menu.shift res << el1 while not menu.empty? res_aux = [] for i in menu if el1.id == i.parent_id print el1," == ",i,"* ",res_aux.index(el1),"\n" res_aux << i # The same shift/delete problem here # This elemente will never be reevaluated after deleted. And... # Using delete here you're assuming that the elements are unique. # Is this always true. If there's 2 "i" elements in the Array, with # this line you'll be deleting the two of them. # You can delete by the index instead. el1 = menu.delete(i) # This use of retry should be considered deprecated. # It seems removed from Ruby 1.9. # retry else print el1," != ",i," \n" end end res << res_aux unless res_aux.empty? el1 = menu.shift res << el1 end # You don't need return here, the "return value" is always the last evaluated expression return res end Good luck! On Fri, Jan 14, 2011 at 11:10 PM, Marcello Henrique wrote: > Hi Abinoam, > > Thanks for reply, actually the first number is 'id' and second > 'parent_id', so correct is: > ["1=>0", >  ["2=>1", >    ["3=>2", >      ["7=>3"] >    ],"5=>1","6=>1" >  ],"4=>0" > ] > > From source flat: > [ "1=>0","2=>1", "3=>2","4=>0","5=>1","6=>1","7=>3"] > > The purpose is to use such as menu like this, based in example above: > >  
    >    
  • "1=>0" >      
      >        
    • "2=>1" >          
        >            
      • "3=>2"
      • >              
          >                
        • "7=>3"
        • >              
        >             >          
      >        
    • >        
    • "5=>1"
    • >        
    • "6=>1"
    • >      
    >    
  • >    
  • "4=>0"
  • >  
>
> > Thanks in advance! > > On Fri, Jan 14, 2011 at 21:29, Abinoam Jr. wrote: >> Hi Marcello, >> >> For helping me understand your desired outcome I manually turned it >> into something more readable (just to read the nesting [] ). >> >> ["1=>0",["2=>1",["3=>2",["7=>3"]],["3=>2"]],["2=>1","5=>1","6=>1"]] >> >> arr[0] = "1=>0" >> arr[1] = ["2=>1", ["3=>2", ["7=>3"]], ["3=>2"]] >> arr[2] = ["2=>1", "5=>1", "6=>1"] >> >> Is this what you want? >> >> On Fri, Jan 14, 2011 at 11:54 AM, Marcello Henrique wrote: >>> Hello, >>> >>> Short question: >>> >>> How to make an iterative method of stack? >>> >>> Long explanation: >>> I'm trying to create an iterative method for following structure: >>> >>> class Obj >>>   attr_accessor: id,: parent_id >>> >>>   def initialize (id, parent_id) >>>     parent_id = @ parent_id >>>     @ id = id >>>   end >>> >>>   def to_s >>>     "id: # {@ id}, parent_id: @ # {parent_id} ' >>>   end >>> end >>> >>> left = [Obj.new (1.0), Obj.new (2.1), Obj.new (3.2), Obj.new (4.0), >>> Obj.new (5.1), Obj new (6.1), Obj.new (7.3)] >>> >>> My challenge is to make an iterative method, see how far I got: >>> >>> def menu_iterative (menu) >>>   res = [] >>> >>>   el1 = menu.shift >>>   res << el1 >>>   while not menu.empty? >>>     res_aux = [] >>>     for i in menu >>>       if el1.id == i.parent_id >>>         print el1, "==" i "* ", res_aux.index (el1), "\ n" >>>         res_aux << i >>>         el1 = menu.delete (i) >>>         retry >>>       else >>>         print el1, "! =" i, "\ n" >>>       end >>>     end >>>     res << res_aux unless res_aux.empty? >>>     puts >>>     el1 = menu.shift >>>     res << el1 >>>   end >>>   return res >>> end >>> >>> puts "result:" >>> pp menu_iterative (left_it) >>> >>> I wish the outcome was: >>> >>> [*, >>>  [#, >>>  [#, >>>   [#]], >>>  [#]], >>>  [#, >>>  #, >>>  #]] >>> >>> It seems that the problem is attribution without stack, correct? >>> I'm attaching all I did. >>> >>> Thanks for any help. >>> -- >>> Marcello Henrique >>> Blog - http://faraohh.wordpress.com >>> Associação Software Livre de Goiás (www.aslgo.org.br) >>> Cercomp - UFG (www.cercomp.ufg.br) >>> >> >> > > > > -- > Marcello Henrique > Blog - http://faraohh.wordpress.com > Associação Software Livre de Goiás (www.aslgo.org.br) > Cercomp - UFG (www.cercomp.ufg.br) > >