Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

RE: RE: Re: Sorting on Section Numbers

by jimt (Chaplain)
on Jul 28, 2000 at 18:08 UTC ( [id://24849]=note: print w/replies, xml ) Need Help??


in reply to RE: Re: Sorting on Section Numbers
in thread Sorting on Section Numbers

There is a slight bug in this solution, it drops letters.
Using the above test data, the following list is generated:
1, 1.2, 2, 2.1.7, 2.2, 2.13, 3.4, 10.1, 10.1, 10.10
which dropped the letters from the section headings.
Here's my version:
@sorted = map {$_->[0], ", "} sort {$a->[0] <=> $b->[0]} map {[$_, pack ("N*", $_)]} @unsorted;

it works the same way, but I substituted in a Schwartzian transform to cache the original value of the heading instead of unpacking it again later. According to some tests with Benchmark, it's about 40% faster than doing the unpack later.
Plus it keeps letters intact.

Replies are listed 'Best First'.
RE: RE: RE: Re: Sorting on Section Numbers
by DrManhattan (Chaplain) on Jul 28, 2000 at 18:37 UTC
RE: RE: RE: Re: Sorting on Section Numbers
by chip (Curate) on Jul 28, 2000 at 22:40 UTC
    Of course that solution drops letters. That was the whole point, demonstrating that things get a lot simpler without them. Quoting myself:

    If we simplify the problem space by eliminating the alphanumerics, things get even neater.

        -- Chip Salzenberg, Free-Floating Agent of Chaos

RE {4} Sorting on Section Numbers
by turnstep (Parson) on Jul 28, 2000 at 21:27 UTC

    > it works the same way, but I substituted in a Schwartzian transform to cache the original
    > value of the heading instead of unpacking it again later. According to some tests with
    > Benchmark, it's about 40% faster than doing the unpack later. Plus it keeps letters intact.

    Unfortunately, there are two problems with this code:

    @sorted = map {$_->[0], ", "} sort { $a->[0] <=> $b->[0]} map {[$_, pack ("N*", $_)]} @unsorted;

    First, the map arguments should be reversed or the sort subscripts should be "1" not "0". As it is, all the code does is a simple sort, and ignores the whole pack part! Second, even when it is fixed, it does not quite sort correctly:

    @unsorted = qw(2 1.2a 2.2 1.2 1.1a); ## A fixed version: @sorted = map {$_->[0], ", "} sort { $a->[1] <=> $b->[1]} map {[$_, pack ("N*", $_)]} @unsorted; print @sorted, "\n"; ## produces: 1.2a, 1.1a, 1.2, 2, 2.2

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2024-03-28 14:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found