Thread Komplexer sort (natürliche Sortierung) (13 answers)
Opened by Student87 at 2012-11-23 17:10

Student87
 2012-11-29 12:23
#163732 #163732
User since
2012-11-08
73 Artikel
BenutzerIn
[default_avatar]
2012-11-23T16:25:57 pq
du kannst den string im sort aufsplitten:
Code (perl): (dl )
1
2
3
4
5
my @sorted = sort {
    my ($chr_a, $num_a) = $a =~ m/^([a-z]+)(\d+)/;
    my ($chr_b, $num_b) = $b =~ m/^([a-z]+)(\d+)/;
    $chr_a cmp $chr_b || $num_a <=> $num_b
} @array;


Danke, aber das bringt leider nicht den gewünschten Output vom Anfangspost, sondern:

chrY
chrY
chrY
chrX
chrX
chrX
chrX
chr1
chr1
chr1
chr2
chr2
chr2
chr10
chr10
chr10
chr10

X und Y stehen also am Anfang der Liste anstatt am Ende und es folgt X auf Y anstatt Y auf X.

Hab ich den Code richtig verstanden?:
Wenn $a = chrX ist, dann matcht das [a-z]+ doch chrX und das \d+ matcht nichts, richtig? Also: $chr_a = chrX und $num_a = undefined.
Nehmen wir an, $b = chr1. Dann wird zuerst chrX mit chr verglichen. Die beiden sind unterschiedlich, also kommt es zu einem Sort und der numerische Sort ("$num_a <=> $num_b") findet nicht mehr statt. Bei dem STATTFINDENEN sort scheint er aber "chr" in der Liste hinter "chrX" zu positionieren. Und wenn man bei einem anderen Sort-Schritt von chrX und chrY ausgeht, positioniert er Y vor X, obwohl alphabetisch gesehen zuerst X kommen müsste.
Wie kann man das korrigieren?

EDIT: Ich glaub, ich hab schon das passende gefunden in der Doc ... "descending" und "ascending" ist das Stichwort :) Ich les das mal und editier hier dann nochmal

EDIT2: Mir ist immer noch nicht klar, wieso pq's code chrY VOR chrX setzt. Es müsste doch alphabetich sortiert sein, da sie $a mit $b vergleicht und nicht $b mit $a (Letzteres würde ja glaub ich die alphabetische Reihenfolge umkehren).
Last edited: 2012-11-29 12:46:08 +0100 (CET)

View full thread Komplexer sort (natürliche Sortierung)