On Sun, Sep 20, 2009 at 10:23 PM, Mason Kelsey <masonkelsey / gmail.com>wrote:

> Tried it but it didn't work.  Made the following change:
>
> require "pqueue"
> pq=PQueue.new(proc{|x,y| x[0]<y[0]})
> pq.push([[12], [123456780], [123456708]])
> pq.push([[23], [123456780], [123456708]])
> pq.push([[4], [123456780], [123456708]])
> pq.push([[33], [123456780], [123456708]])
> pq.push([[02], [123456780], [123456708]])
> pq.push([[54], [123456780], [123456708]])
> print "size:"+pq.size.to_s+"\n"
> print "each_pop: "
> pq.each_pop{|x| print x.to_s+" "}
> print "\n"
> I got the messages:
> >ruby simple_pqueue.rb
> simple_pqueue.rb:3: undefined local variable or method `x' for main:Object
> (NameError)
>  from ./pqueue.rb:24:in `[]'
>  from ./pqueue.rb:24:in `upheap'
>  from ./pqueue.rb:65:in `push'
>  from simple_pqueue.rb:5
> >Exit code: 1
>
> The "from" error messages appear to be coming from the code inside of the
> pqueue class methods.
>
> Doesn't like the brackets.  I tried several variations of this and also got
> a message that said the < is an invalid method.  Very strange.  Sorry but
> I'm totally confused here.
>
> There must be a way to do this.
>
> No Sam
>
> On Sun, Sep 20, 2009 at 10:31 PM, Mario Camou <mcamou / tecnoguru.com>
> wrote:
>
> > Hi,
> > In the line:
> >
> > pq.push([2], [123456780], [123456708])
> >
> > you're not passing in a multi-dimensional array, you're passing 3
> > parameters
> > each of which is an array. Try with:
> >
> > pq.push([[2], [123456780], [123456708]])
> >
> > (notice the double [ at the beginning and the  double ] at the end).
> >
> > you will also have to change your PQueue creation to something like this:
> >
> > pq=PQueue.new(proc{|x,y| x[0]<y[0]})
> >
> > Haven't tested this in irb but it (or something very much like it) should
> > work.
> >
> > -Mario.
> >
> > --
> > I want to change the world but they won't give me the source code.
> >
> >
> > On Mon, Sep 21, 2009 at 04:25, Mason Kelsey <masonkelsey / gmail.com>
> wrote:
> >
> > > In my program I need to construct a priority queue that sorts
> ascending.
> > > The basic idea can be expressed in the following simple code that uses
> a
> > > Priority Queue concept.  See:
> > > http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-pqueue.html<http://www.math.kobe-u.ac.jp/%7Ekodama/tips-ruby-pqueue.html>
> > >
> > > 1   require "pqueue"
> > > 2
> > > 3   pq=PQueue.new(proc{|x,y| x<y})
> > > 4   pq.push(2)
> > > 5   pq.push(3)
> > > 6   pq.push(4)
> > > 7   pq.push(3)
> > > 8   pq.push(2)
> > > 9   pq.push(4)
> > > 10 print "size:"+pq.size.to_s+"\n"
> > > 11 print "each_pop: "
> > > 12 pq.each_pop{|x| print x.to_s+" "}
> > > 13 print "\n"
> > >
> > > This is clean and simple to understand.  But I need to be able to put
> > into
> > > the queue several components per push to make an entire record object.
>  I
> > > need to have three components: an integer heuristic value, followed by
> > two
> > > 9
> > > digit configuration patterns, such as
> > > pq.push([2], [123456780], [123456708])  But this gives me an argument
> > error
> > > message:
> > > pqueue.rb:4:in `push': wrong number of arguments (3 for 1)
> > > (ArgumentError) from pqueue.rb:4
> > >
> > > or pq.push(2_123456780_123456708) ignores the underscore separators and
> > > runs
> > > the 3 parts together as one long number.
> > >
> > > Still learning Ruby and none of the books address multiple dimensional
> > > arrays very well.  Is the Priority Queue not able to handle
> > > multi-dimensional arrays?  Can this code be modified to allow
> > > multi-elements
> > > in each push and still sort on the first element?
> > >
> > > If I cannot use pqueue, is there another required library of methods
> that
> > > will work with three elements in each array entry?
> > >
> > > Thanks in advance to those of you who can help.  And thanks to all who
> > help
> > > out on this forum.  Very good forum.
> > >
> > > No Sam
> > >
> >
>

require "pqueue"
pq=PQueue.new proc{|x,y| x[0][0]<y[0][0]}
pq.push([[12], [123456780], [123456708]])
pq.push([[23], [123456780], [123456708]])
pq.push([[4],  [123456780], [123456708]])
pq.push([[33], [123456780], [123456708]])
pq.push([[02], [123456780], [123456708]])
pq.push([[54], [123456780], [123456708]])
print "size:"+pq.size.to_s+"\n"
print "each_pop: "
pq.each_pop{|x| p x}

__END__
output that I got:
size:6
each_pop: [[2], [123456780], [123456708]]
[[4], [123456780], [123456708]]
[[12], [123456780], [123456708]]
[[23], [123456780], [123456708]]
[[33], [123456780], [123456708]]
[[54], [123456780], [123456708]]

You were passing a two dimensional array, so x[0] returns an array, ie [2]
to get it to an integer, you need to go in one more time so x[0][0] would
return 2, which is comparable to other integers.

You should consider making a class to handle these objects.