Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12485[/thread]

Array-Sortierung nach vorgegebenen Mustern?

Leser: 1


<< >> 3 Einträge, 1 Seite
toby
 2008-09-12 17:48
#114572 #114572
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

wie kann ich am einfachsten ein gefülltes Array nach vorgegebenen Mustern sortieren?

Angenommen, ich habe ein Array, das folgendermassen gefüllt ist:

@array = qw/abcxyz abc-xyz abc_xyz xyz-abc xyzabc xyz_abc/;

Nun möchte ich @array sortieren und zwar so, dass zu erst alle Teile mit "-", dann alle mit "_", dann der Rest kommen. Mein Muster wäre also erst "-", dann "_", dann der Rest, so dass am Ende ein sortiertes Array folgendermassen aussehen müsste:

@arraySortiert = qw/abc-xyz xyz-abc abc_xyz xyz_abc abcxyz xyzabc/;

Ich habe es probiert und dabei sind die wildesten Konstrukte entstanden...So habe mir ein Hilfsarray gemacht @hilfe = qw/- _/, und danach @array mit while durchgelaufen und bei match shift gemacht. Es sieht aber ziemlich schrecklich aus und das muss einfacher gehen. Ich habe aber momentan keine Idee, wie ich es angehen soll. Ich schätze grep und map sind hier die Zaubermitteln.

Hat jemand eine Idee, wie man dieses Problemchen am einfachsten lösen kann?

Danke!
T.
pq
 2008-09-12 17:56
#114573 #114573
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
my @sorted = map {
    $_->[1]
} sort {
    $a->[0] <=> $b->[0] || $a->[1] cmp $b->[1]
} map {
    [tr/-// ? 0 : tr/_// ? 1 : 2, $_]
} @array;

nennt sich http://en.wikipedia.org/wiki/Schwartzian_transform
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
LanX-
 2008-09-12 19:00
#114577 #114577
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
der Knackpunkt ist doch weniger die Schwartzsche Transformation, sondern dass man Sortierungsterme mittels OR hintereinanderschalten kann, oder? [*] Der Trick ist das dank lazy-Evaluation von OR der 2. term erst evaluiert wird, wenn der erste 0 und falsch ist (was gdw. der Fall ist wenn die Arrayeinträge in der gleichen Klasse liegen, also (- und -) oder (_ und _) ... ) Schwartz machts nur schneller... NACHTRAG: wenn in einem string sowohl _ als auch - auftreten, wirds übrigens mit diesem Ansatz komplizierter. [*] was übrigens ein sehr schöner Trick ist.
<< >> 3 Einträge, 1 Seite



View all threads created 2008-09-12 17:48.