TGI has asked for the wisdom of the Perl Monks concerning the following question:
I've written some code to sort an array by the values in another array. I'd like some monastery reaction, pointers, and correction.
Precisely what I want to do, is sort the elements of an array, @sortme = qw(foo bar baz cat dog elephant bird, based on the order of the elements in another array, @order = (whale elephant dog cat), placing unlisted (in @order) items at the end of the list.
Here's the code:
This seems to work fine. But, I'd like to know, is there a better/faster/cleaner algorithm that I would know of if I didn't always sleep through my CS classes? Should I be using map to do this?#!/usr/bin/perl -w use strict; use Data::Dumper; my @sites = qw(Hillsboro Rialto Santa_Ana Memphis Richmond); my @sortme = sort {$a cmp $b} @sites; unshift @sortme, 'Foo', 'Bar'; print Dumper \@sortme; { my %order; foreach (0..$#sites) { $order{$sites[$_]} = $_; # build index } $order{DEFAULT} = $#sites + 1; my @sorted = sort { if (exists $order{$a} && exists $order{$b}) { $order{$a} <=> $order{$b} } elsif ( exists $order{$a}) { $order{$a} <=> $order{DEFAULT} } elsif ( exists $order{$b} ) { $order{DEFAULT} <=> $order{$b} } else { $a cmp $b } } @sortme; print Dumper \@sorted }
TIA
TGI says moo
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Sorting an array by another array
by Masem (Monsignor) on Dec 04, 2001 at 23:34 UTC | |
|
Re: Sorting an array by another array
by clintp (Curate) on Dec 05, 2001 at 00:16 UTC | |
|
Re: Sorting an array by another array
by sfink (Deacon) on Dec 05, 2001 at 00:22 UTC | |
|
Re: Sorting an array by another array
by duelafn (Parson) on Dec 05, 2001 at 00:27 UTC | |
|
Re: Sorting an array by another array
by runrig (Abbot) on Dec 05, 2001 at 01:01 UTC | |
|
Re: Sorting an array by another array
by stefp (Vicar) on Dec 05, 2001 at 07:27 UTC |