Sortieren (nicht gerade einfach)
Torwächter
- perl
Hallo zusammen,
mir wurde damals bei diesem Problem schon sehr gut geholfen, daher wende ich mich mit solch einem Problem auch wieder an euch:
ich habe eine Linkliste, in welcher Punkte vergeben werden können.
Die Links lasse ich dann so sortieren:
for (sort {$punktsorterA{$b} <=> $punktsorterA{$a}} keys %punktsorterA)
{
}
Hierbei werden aber nur nach punkten sortiert, was zur Folge hätte, dass mehrere auf Platz 1 landen könnten, daher habe ich das versucht:
for (sort {$punktsorterA{$b} <=> $punktsorterA{$a}} keys %punktsorterA)
{
for (sort {$stimmensorterA{$b} <=> $stimmensorterA{$a}} keys %stimmensorterA)
{
}
}
Was aber nun bewirkt, dass bei 3 Links 9 angezeigt werden.
Was kann ich machen, dass erst nach Clicks, dann nach Stimmen sortiert wird ?
Vielen Dank im Voraus
Greetings
Torwächter
Hallo,
[... nach mehreren Kriterien sortieren ...]
Die perlfaq haette dir weitergeholfen:
my @double_sorted = sort {
$hash->{$a}->{field1} <=> $hash->{$b}->{field1}
||
$hash->{$a}->{field2} cmp $hash->{$b}->{field2}
} keys %{$hash};
Natuerlich kannst du die Sortierung noch beliebig erweitern.
Gruesse,
CK
Hi CK,
nach ca 10 Minuten Codebetrachten hab ich verstanden, was das || da drin sucht :) man kann ja einfach schreiben :
sort {$hash->{$a}->{field1} <=> $hash->{$b}->{field1} || $hash->{$a}->{field2} cmp $hash->{$b}->{field2}} keys %{$hash};
Vielen Dank,
Greetings
Torwächter
Ich hab nun das ganze soweit gekürzt :
for (sort {$click{$b} <=> $click{$a} || $stimmen{$b} cmp $stimmen{$a}} keys %click)
und es funzt.
Doch mache ich mir gedanken, ob das %click vielleicht irgendwas durcheinander bringt ?
Greetings
Torwächter
Hallo,
Doch mache ich mir gedanken, ob das %click vielleicht irgendwas durcheinander
bringt ?
Durcheinander bringt?
Es wird zuerst nach $click{$b} <=> $click{$a} sortiert, danach nach $stimmen{$b}
cmp $stimmen{$a} (btw., wenn das ein numerischer Wert ist (danach hoert es sich
an), wuerde ich <=> benutzen). Der Hash bleibt, wie er ist, die Keys in einem
Hash haben keine definierte Reihenfolge.
Gruesse,
CK
Ok, nun ersetzte ich nur noch cmp durch <=> und fertig.
Vielen Dank, du hast mir sehr geholfen.
Greetings
Torwächter
Hallo Torwaechter,
nach ca 10 Minuten Codebetrachten hab ich verstanden, was das || da drin sucht
:) man kann ja einfach schreiben :
sort {$hash->{$a}->{field1} <=> $hash->{$b}->{field1} || $hash->{$a}->{field2} cmp $hash->{$b}->{field2}} keys %{$hash};
Ich verstehe nicht. Wo ist das Problem mit dem Zeilenumbruch? Ein Block bleibt
ein Block, ob mit oder ohne Zeilenumbruch...
Gruesse,
CK
nur ich habe so noch nie die Zeile umgebrochen und bin davon ausgegangen, du willst damit sagen, Zeile 1 = Zeile 2 :)
Greetings
Torwächter