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=E9todos busca em profundidade iterativo def menu_iterative(menu) res =3D [] # 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 =3D menu.shift res << el1 while not menu.empty? res_aux =3D [] for i in menu if el1.id =3D=3D i.parent_id print el1," =3D=3D ",i,"* ",res_aux.index(el1),"\n" res_aux << i =09 # 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 =3D menu.delete(i) =09 # This use of retry should be considered deprecated. # It seems removed from Ruby 1.9. # retry =09 else print el1," !=3D ",i," \n" end end res << res_aux unless res_aux.empty? el1 =3D 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 <faraohh / gmail.com> wro= te: > Hi Abinoam, > > Thanks for reply, actually the first number is 'id' and second > 'parent_id', so correct is: > ["1=3D>0", > =A0["2=3D>1", > =A0 =A0["3=3D>2", > =A0 =A0 =A0["7=3D>3"] > =A0 =A0],"5=3D>1","6=3D>1" > =A0],"4=3D>0" > ] > > From source flat: > [ "1=3D>0","2=3D>1", "3=3D>2","4=3D>0","5=3D>1","6=3D>1","7=3D>3"] > > The purpose is to use such as menu like this, based in example above: > <menu> > =A0<ul> > =A0 =A0<li class=3D"sub">"1=3D>0" > =A0 =A0 =A0<ul> > =A0 =A0 =A0 =A0<li class=3D"sub">"2=3D>1" > =A0 =A0 =A0 =A0 =A0<ul> > =A0 =A0 =A0 =A0 =A0 =A0<li class=3D"sub">"3=3D>2"</li> > =A0 =A0 =A0 =A0 =A0 =A0 =A0<ul> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0<li>"7=3D>3"</li> > =A0 =A0 =A0 =A0 =A0 =A0 =A0</ul> > =A0 =A0 =A0 =A0 =A0 =A0</li> > =A0 =A0 =A0 =A0 =A0</ul> > =A0 =A0 =A0 =A0</li> > =A0 =A0 =A0 =A0<li>"5=3D>1"</li> > =A0 =A0 =A0 =A0<li>"6=3D>1"</li> > =A0 =A0 =A0</ul> > =A0 =A0</li> > =A0 =A0<li>"4=3D>0"</li> > =A0</ul> > </menu> > > Thanks in advance! > > On Fri, Jan 14, 2011 at 21:29, Abinoam Jr. <abinoam / gmail.com> wrote: >> Hi Marcello, >> >> For helping me understand your desired outcome I manually turned it >> into something more readable (just to read the nesting [] ). >> >> ["1=3D>0",["2=3D>1",["3=3D>2",["7=3D>3"]],["3=3D>2"]],["2=3D>1","5=3D>1"= ,"6=3D>1"]] >> >> arr[0] =3D "1=3D>0" >> arr[1] =3D ["2=3D>1", ["3=3D>2", ["7=3D>3"]], ["3=3D>2"]] >> arr[2] =3D ["2=3D>1", "5=3D>1", "6=3D>1"] >> >> Is this what you want? >> >> On Fri, Jan 14, 2011 at 11:54 AM, Marcello Henrique <faraohh / gmail.com> = 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 >>> =A0 attr_accessor: id,: parent_id >>> >>> =A0 def initialize (id, parent_id) >>> =A0 =A0 parent_id =3D @ parent_id >>> =A0 =A0 @ id =3D id >>> =A0 end >>> >>> =A0 def to_s >>> =A0 =A0 "id: # {@ id}, parent_id: @ # {parent_id} ' >>> =A0 end >>> end >>> >>> left =3D [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) >>> =A0 res =3D [] >>> >>> =A0 el1 =3D menu.shift >>> =A0 res << el1 >>> =A0 while not menu.empty? >>> =A0 =A0 res_aux =3D [] >>> =A0 =A0 for i in menu >>> =A0 =A0 =A0 if el1.id =3D=3D i.parent_id >>> =A0 =A0 =A0 =A0 print el1, "=3D=3D" i "* ", res_aux.index (el1), "\ n" >>> =A0 =A0 =A0 =A0 res_aux << i >>> =A0 =A0 =A0 =A0 el1 =3D menu.delete (i) >>> =A0 =A0 =A0 =A0 retry >>> =A0 =A0 =A0 else >>> =A0 =A0 =A0 =A0 print el1, "! =3D" i, "\ n" >>> =A0 =A0 =A0 end >>> =A0 =A0 end >>> =A0 =A0 res << res_aux unless res_aux.empty? >>> =A0 =A0 puts >>> =A0 =A0 el1 =3D menu.shift >>> =A0 =A0 res << el1 >>> =A0 end >>> =A0 return res >>> end >>> >>> puts "result:" >>> pp menu_iterative (left_it) >>> >>> I wish the outcome was: >>> >>> [*, >>> =A0[#<Obj:0x7f35b48cab18 @id=3D2, @parent_id=3D1>, >>> =A0[#<Obj:0x7f35b48caaf0 @id=3D3, @parent_id=3D2>, >>> =A0 [#<Obj:0x7f35b48caa50 @id=3D7, @parent_id=3D3>]], >>> =A0[#<Obj:0x7f35b48caaf0 @id=3D3, @parent_id=3D2>]], >>> =A0[#<Obj:0x7f35b48cab18 @id=3D2, @parent_id=3D1>, >>> =A0#<Obj:0x7f35b48caaa0 @id=3D5, @parent_id=3D1>, >>> =A0#<Obj:0x7f35b48caa78 @id=3D6, @parent_id=3D1>]] >>> >>> 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=E7=E3o Software Livre de Goi=E1s (www.aslgo.org.br) >>> Cercomp - UFG (www.cercomp.ufg.br) >>> >> >> > > > > -- > Marcello Henrique > Blog - http://faraohh.wordpress.com > Associa=E7=E3o Software Livre de Goi=E1s (www.aslgo.org.br) > Cercomp - UFG (www.cercomp.ufg.br) > >