What happens in dual sorts with nil values?

I’ve put together an array that has a map. I did this so I could do some
multi-level sorting of data. For example, if I had a map with:

Struct.new(:first, :last, :age)

And let’s say I only had some of the ages, so some values were nil.

Doing a multi-level sort using

person.sort_by! { |a| [a.last, a.first, a.age]}

gives me a list sorted correctly by last name, then first, and age??
(maybe, I need to test more)

If I put the sort_by with a.age first, then I get an error.

block in <top (required)>': undefined local variable or methodball_map’ for main:Object (NameError)

I’m assuming this is because I’m trying to sort integers and have one
with a nil value. So my question really is two-fold. Can I sort based on
age if some values are nil? (doesn’t look like it), and second, am I
fooling myself into thinking that I’m sorting on a.age when it’s not the
first sort value?

Wayne

I didn’t test it, but it looks like a bad idea :wink: So don’t compare
nils. Just replace them with zeros or infinities (depending on whether
you want them to end up at the start or end of list), for example like
this:

person.sort_by! { |a| [ a.last, a.first, a.age || 0 ]}

(Note that this will also replace false values with zeros.)

– Matma R.

On Fri, Nov 4, 2011 at 6:49 PM, Wayne B. [email protected]
wrote:

gives me a list sorted correctly by last name, then first, and age?? (maybe, I
need to test more)

If I put the sort_by with a.age first, then I get an error.

block in <top (required)>': undefined local variable or method ball_map’ for
main:Object (NameError)

Where does “ball_map” come from? It’s not in the code you’ve shown.

I’m assuming this is because I’m trying to sort integers and have one with a nil
value. So my question really is two-fold. Can I sort based on age if some values
are nil? (doesn’t look like it),

See Bartoz’s suggestion.

and second, am I fooling myself into thinking that I’m sorting on a.age when
it’s not the first sort value?

You’re not fooling yourself. But the order determines the precedence.
The second field is only evaluated if the first fields are equal and
so forth.

Kind regards

robert

On Nov 4, 2011, at 6:11 PM, Robert K. wrote:

block in <top (required)>': undefined local variable or methodball_map’ for
main:Object (NameError)

Where does “ball_map” come from? It’s not in the code you’ve shown.

I tried to make the example something that was a bit more simplistic yet
showed exactly what I was doing instead of the actual code (it’s an IC
chip ball map/signal sorting routine). Next time I’ll stick to the real
stuff. :wink:

and second, am I fooling myself into thinking that I’m sorting on a.age when
it’s not the first sort value?

You’re not fooling yourself. But the order determines the precedence.
The second field is only evaluated if the first fields are equal and
so forth.

Thanks. I wasn’t sure if it failed and since the first sort was done
just didn’t put up the error message, thus not really working. But I
suspect since the only time it’s coming into play is when signals, in my
case, have the same name so it moves onto their signal value (AB[0],
AB[1] AB[10], etc. ) what I was doing was creating a new array in the
method that held the numbers so AB[10] didn’t get placed after AB[1] in
the sort. I was still running into issues during the sort, then I
realized my error yesterday, I wasn’t changing the numbers I was pulling
out of the brackets from strings to numbers. Now that I’ve done that my
sort list works perfectly.

As I work my way down the road with Ruby, I can’t believe I stayed away
from OOP for so long. I’ve had a bit of a hard time wrapping my brain
around a few concepts, but some of the cool things I’ve started to do
with it are saving me tons of time and coding. :slight_smile: – So folks, if I
ask what seem like idiotic questions from time to time, it’s probably
because I keep falling back to old habits of how I would have done
things instead of how an OOP language handles things.

Thanks everybody for your suggestions on this one.

Wayne

On Sat, Nov 5, 2011 at 1:43 PM, Wayne B. [email protected]
wrote:

On Nov 4, 2011, at 6:11 PM, Robert K. wrote:

and second, am I fooling myself into thinking that I’m sorting on a.age when
it’s not the first sort value?

You’re not fooling yourself. But the order determines the precedence.
The second field is only evaluated if the first fields are equal and
so forth.

Thanks. I wasn’t sure if it failed and since the first sort was done just didn’t
put up the error message, thus not really working. But I suspect since the only
time it’s coming into play is when signals, in my case, have the same name so it
moves onto their signal value (AB[0], AB[1] AB[10], etc. ) what I was doing was
creating a new array in the method that held the numbers so AB[10] didn’t get
placed after AB[1] in the sort. I was still running into issues during the sort,
then I realized my error yesterday, I wasn’t changing the numbers I was pulling
out of the brackets from strings to numbers. Now that I’ve done that my sort list
works perfectly.

Good! As a side note: often people new to Ruby seem to try to work
with only the basic types (String, Fixnum, Array, Hash) as is. Once
they make the step to defining their own types with proper methods
things usually become simpler and better structured. I think this is
the moment when they truly embrace OO and cross the border from
procedural style programming to OO programming. So by defining
Structs for your data you have crossed the Rubikon already. :slight_smile:

As I work my way down the road with Ruby, I can’t believe I stayed away from OOP
for so long. I’ve had a bit of a hard time wrapping my brain around a few
concepts, but some of the cool things I’ve started to do with it are saving me
tons of time and coding. :slight_smile:

When I was first exposed to OO (back in the times of Turbo Pascal 5.5)
it took my quite some time to grasp those concepts, too. Now it has
become second nature and feels like the most natural thing to do in
programming. I think that’s a normal learning experience.

So folks, if I ask what seem like idiotic questions from time to time, it’s
probably because I keep falling back to old habits of how I would have done things
instead of how an OOP language handles things.

No worries, we’ll put you back on track. :wink:

Thanks everybody for your suggestions on this one.

You’re welcome!

Kind regards

robert