Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Sort over remaining part of array

by hdb (Monsignor)
on Nov 12, 2013 at 10:03 UTC ( #1062164=note: print w/replies, xml ) Need Help??

in reply to Sort over remaining part of array

Sorting with respect to the first column is a bit more involved compared to your code, see below. Sorting only part of the array can be achieved using array slices:

@AoA = ( [ 0.5, "b1", "c0" ], [ 0.4, "b1", "c1" ], [ 0.7, "b2", "c2" ], [ 0.3, "b3", "c3" ], [ 0.6, "b3", "c4" ], ); @AoA[2..$#AoA] = sort { $a->[0] <=> $b->[0] } @AoA[2..$#AoA]; print Dumper \@AoA;

Replies are listed 'Best First'.
Re^2: Sort over remaining part of array
by Laurent_R (Canon) on Nov 12, 2013 at 19:57 UTC

    The OP said descending order, so the key codeline should probably be:

    @AoA[2..$#AoA] = sort { $b->[0] <=> $a->[0] } @AoA[2..$#AoA];
    But that is only a detail.

Re^2: Sort over remaining part of array
by monkini (Initiate) on Nov 12, 2013 at 11:15 UTC

    That helps, thanks!

    However, I still get an error "Use of uninitialized value in numeric comparison (<=>)" and it seems like the loop never ends...

    @AoA[0..$#AoA] = sort { $b->[0] <=> $a->[0] } @AoA[0..$#AoA]; my %seen = (); my $j = 0; while ($j < $#AoA) { my $b = $AoA[$j][1]; my $c = $AoA[$j][2]; if ( ! $seen{$b}++ ) { # $b not seen before DO STH WITH $b AND $c $seen{$b}++; } else { #seen $b before my ($b, $a) = RESAMPLE; $AoA[$j][0] = $a; $AoA[$j][1] = '$b'; @AoA[$j..$#AoA] = sort { $b->[0] <=> $a->[0] } @AoA[$j..$#AoA] +; } }

    ...any ideas?

      You re-sort the part of the array starting at $a after resampling $a. What if $a is higher after resampling? It would have to be inserted somewhere before the part you want to re-sort. Instead of sorting the complete array just because one element changes you could just find out where the resampled element has to go and use splice to extract and insert it at the new place

      Even better: Don't sort at all, resample until all $b's are unique and then do just one sort.

      Well, at a glance it looks like $j will remain zero forever...

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1062164]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (7)
As of 2021-10-25 10:56 GMT
Find Nodes?
    Voting Booth?
    My first memorable Perl project was:

    Results (89 votes). Check out past polls.