Sortieren einer Tabelle
Holger A.
- perl
Hallo zusammen,
Hab da schon wieder ein Problem, an dem ich nun 3 Tage
schon herum mache.
Ich möchte eine Tabelle nach Zahlen sortieren.
my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;
@sortiert = reverse @unsortiert;
Dieser Sortiert natürlich die Tabelle nach der 5. Spalte.
So sollte das Ergebniss ausehen:
40
39
38
20
19
13
12
12
9
5
4
3
2
1
und so siehts aus aus wenns der sort Befehl von oben es ausführt.
9
5
4
40
3
39
38
2
20
1
19
13
12
12
Was mache ich Falsch ?
Vielen Dank für eure Antworten
Gruss Holger A.
Hallo Holger,
my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;
@sortiert = reverse @unsortiert; ^.........1) ^..........2)
^..........3)
Da kann ich Dir hoffentlich helfen ;-)
Gruß AlexBausW
Hallo Holger, Alex
Hallo Holger,
my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))
[4]} besucher;
@sortiert = reverse @unsortiert; ^.........1) ^..........2)
^..........3)Da kann ich Dir hoffentlich helfen ;-)
- Verwende einfach statt cmp (Stringvergleich) <=> (numerischer
Vergleich)- fehlt hier nicht ein Ed? ;-)
- reverse kannst Du Dir ersparen, wenn Du $a und $b vertauschst.
Dann ist @unsortiert (was ja eigentlich nicht stimmt ;-) in
absteigender Reihenfolge sortiert.
Zusaetzlich dazu sollte man noch sagen, dass man das split ausserhalb
des sort Blocks vornehmen sollte, da dieser sehr haeufig durchlaufen werden kann.
Hier kann man sich die Schwartz'sche Transformation zur Hilfe nehmen
s. perldoc -q sort / perlfaq4
How can I sort a array by (anything)
Bei Deinem Beispiel wuerde das dann so aussehen:
my @sortiert= map {$_->[0]}
sort {$b->[1] <=> $a->[1]}
map { [$_, (split //,$_)[4] ] } @besucher;
Gruß AlexBausW
Gruss
Kai
Hallo Holger,
my @unsortiert = sort {(split(//,$a))[4] cmp (split(//,$b))[4]} besucher;
@sortiert = sort {(split(//,$b))[4] <=> (split(//,$a))[4]} besucher;
Johannes
Ja, jetzt tut‚s.
Vielen Dank für die schnellen Antworten.
Gruß Holger A.