Newbie question about nested sort

From: Robert Klemme [mailto:bob.news@gmx.net]

Grehom wrote:
> what am I doing wrong? I wanted to sort primarily on count (second
> position in array), then sub-sort alphabetically (first position in
> array)
>
> char_freq = [["c", 2],["b", 5],["a", 2]]
> sorted_freq = char_freq.sort {|a, b| b[1]<=>a[1] || a[0]<=>b[0] }
> sorted_freq.each do |d|
> print d[0]*d[1]
> end
>
> [...]

Generally you need to do conditional evaluation based on higher prio
results. Using "||" or "or" won't help here (dunno what Perl
does here).

You want something like
[...]

hmmm, I don't think he realy *want's* this.

Please don't scare our new perl friends away... :slight_smile:
there is a simple solution to that:

char_freq = [["c", 2],["b", 5],["a", 2]]
sorted_freq = char_freq.sort {|a, b| (b[1]<=>a[1]).nonzero? ||
a[0]<=>b[0] }
sorted_freq.each do |d|
   print d[0]*d[1]
end

cheers

Simon

Kroeger, Simon (ext) wrote:

From: Robert Klemme [mailto:bob.news@gmx.net]

Grehom wrote:

what am I doing wrong? I wanted to sort primarily on count (second
position in array), then sub-sort alphabetically (first position in
array)

char_freq = [["c", 2],["b", 5],["a", 2]]
sorted_freq = char_freq.sort {|a, b| b[1]<=>a[1] || a[0]<=>b[0] }
sorted_freq.each do |d|
   print d[0]*d[1]
end

[...]

Generally you need to do conditional evaluation based on higher prio
results. Using "||" or "or" won't help here (dunno what Perl
does here).

You want something like
[...]

hmmm, I don't think he realy *want's* this.

Please don't scare our new perl friends away... :slight_smile:

:-)))

there is a simple solution to that:

char_freq = [["c", 2],["b", 5],["a", 2]]
sorted_freq = char_freq.sort {|a, b| (b[1]<=>a[1]).nonzero? ||
a[0]<=>b[0] }
sorted_freq.each do |d|
   print d[0]*d[1]
end

I didn't think of using #nonzero? - this clearly resembles the perl
solution most. Although I'd say that I'd probably prefer the sort_by
approach with negated values...

Kind regards

    robert