in reply to Re^3: How would I sort a two-dimensional array by multiple columns?
in thread How would I sort a two-dimensional array by multiple columns?
In essence, neither goes deep enough to resolve differences - jettero stops at the second element, and FunkyMonk stops after index 3.
FunkyMonk - in your code, "@_" inside the sort is probably not what you think it is - at that point, @_ is still the parameter passed into "sortsub". Inside the sort itself, you only have $a and $b. The "@_" comes from the outer sub.
Here is code with slightly modified data, that demonstrates the errors, and my proposed "correct" solution.
Output:#!/usr/bin/perl use strict; use Data::Dumper; use Test::More qw/no_plan/; my $unsorted = [ [ qw/1 3 5 6 2/ ], [ qw/3 4 5 6 7/ ], [ qw/1 2 3 4 5/ ], [ qw/5 6 7 9 9/ ], [ qw/5 6 7 9 8/ ], [ qw/1 2 3 4 5/ ], [ qw/2 2 2 2 2/ ], [ qw/1 1 2 4 5/ ], [ qw/2 3 4 5 6/ ], ]; my $expected = [ [ qw/1 1 2 4 5/ ], [ qw/1 2 3 4 5/ ], [ qw/1 2 3 4 5/ ], [ qw/1 3 5 6 2/ ], [ qw/2 2 2 2 2/ ], [ qw/2 3 4 5 6/ ], [ qw/3 4 5 6 7/ ], [ qw/5 6 7 9 8/ ], [ qw/5 6 7 9 9/ ], ]; my $sorted = FunkyMonkSort($unsorted, 0, 1, 3); is_deeply $sorted, $expected, "FunkyMonk Sort"; # Print ($sorted,"After FunkyMonk Sort"); sub FunkyMonkSort { my @array = @{ +shift }; my @sorted = sort { for my $ix (@_ ) { # Updated from " 0 .. @_" - per updates fr +om FonkyMonk my $cmp = $a->[$ix] <=> $b->[$ix]; return $cmp if $cmp; } return 0; } @array; return \@sorted; } #------------------------------- my @jettero = sort {$a->[0]<=>$b->[0] || $a->[1]<=>$b->[1]} @$unsorted +; is_deeply \@jettero, $expected, "jettero Sort"; #Print ($sorted,"After jettero Sort"); #--------------------- NetWallah ---- my @b =sort NetWallahSort @$unsorted; is_deeply \@b, $expected, "NetWallah Sort"; sub NetWallahSort{ # Auto import $a, $b, which are array refs for my $i(0..$#$a){ next if $a->[$i] == $b->[$i]; return $a->[$i] <=> $b->[$i]; } return 0; #Pathological (Updated from "return 1" per ikegami's nod +e below) } sub Print{ my $aref=shift or die "No array supplied"; my $title=shift || ''; print "----- $title --\n"; for (@$aref){ print "\t" . join(", ",@$_) . "\n"; } print "-------------------\n\n"; }
not ok 1 - FunkyMonk Sort # Failed test 'FunkyMonk Sort' # at test-arr.pl line 33. # Structures begin differing at: # $got->[7][4] = '9' # $expected->[7][4] = '8' not ok 2 - jettero Sort # Failed test 'jettero Sort' # at test-arr.pl line 49. # Structures begin differing at: # $got->[7][4] = '9' # $expected->[7][4] = '8' ok 3 - NetWallah Sort 1..3 # Looks like you failed 2 tests of 3.
Update 2: The O.P. has correctly chosen Funkymonk's code as representing what he requested.
My code addresses a different issue - sorting to the complete depth.
"As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: How would I sort a two-dimensional array by multiple columns?
by TGI (Parson) on Mar 15, 2008 at 23:56 UTC | |
by NetWallah (Canon) on Mar 16, 2008 at 00:35 UTC | |
|
Re^5: How would I sort a two-dimensional array by multiple columns?
by FunkyMonk (Bishop) on Mar 15, 2008 at 23:32 UTC | |
|
Re^5: How would I sort a two-dimensional array by multiple columns?
by ikegami (Patriarch) on Mar 16, 2008 at 03:32 UTC | |
|
Re^5: How would I sort a two-dimensional array by multiple columns?
by dbmathis (Scribe) on Mar 15, 2008 at 22:29 UTC | |
by NetWallah (Canon) on Mar 15, 2008 at 22:44 UTC |