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 method `ball_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 Rex

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 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 Fri, Nov 4, 2011 at 6:49 PM, Wayne Brissette <waynefb@earthlink.net> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

`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 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 Nov 4, 2011, at 6:11 PM, Robert Klemme 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

···

On Sat, Nov 5, 2011 at 1:43 PM, Wayne Brissette <waynefb@earthlink.net> wrote:

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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/