User since
2003-09-24
111
Artikel
BenutzerIn
Hallo an alle,
ich habe ein Problem mit dem sortieren, und weiss nicht so recht
wie ich es löse.
folgendes möchte ich sortieren:
C1,C12,R5,C3,C21,C2,D12
sort liefert eine alphabetische Sortierung:
C1, C12, C13, C2, C21
ich hätte aber gerne
C1, C2, C12, C13, C21...
Habe mir verschieden Sortscripte angeschaut, aber find keine Lösung für
diese Art der Sortierung.
Wär super wenn einer helfen könnte.
Danke
Gruß
Andreas
User since
2004-02-19
1750
Artikel
BenutzerIn
Folgendes Script zerlegt die einzelnen Elemente erst so, dass sie sortierbar werden, sortiert sie und fügt sie dann wieder zusammen. Nennt sich Schwartzsche Transformation nach Randal Schwartz:
my @foo = qw/C1 C12 R5 C3 C21 C2 D12/;
@foo =
map { $_->[0] . $_->[1] }
sort { $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1] }
map { [/(\D*)(\d*)/] } @foo;
print join( ", ", @foo ) . "\n";
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
User since
2006-01-27
3891
Artikel
HausmeisterIn
Ähnliche Lösung, ebenfalls Schwartzsche Transformation:
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
my @list = qw( C1 C12 R5 C3 C21 C2 C12 );
my @sort =
map { $_->[0] }
sort { $a->[1] cmp $b->[1] || $a->[2] <=> $b->[2] }
map { [ $_, m/^(\D+)(\d+)/ ] }
@list;
print "@sort\n";
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!