PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [CGI]Hashes nach Wert sortieren


M@tes
2005-01-05, 22:33:52
Jo wie mach ich das?
Wenn ich z.B. son Hash habe:
$Hash{Punkte1} = 345;
$Hash{Punkte2} = 123;
$Hash{Punkte3} = 548;

Ich will mittels einer foreachschleife alle Punkte auflisten.
Allerdings ist bei Hashes alls durcheinander. Wie kann ich aber die Reihenfolge so bestimmen, das z.B. die grösste Zahl (value) samt Hashkey als erstes aufgelistet wird und dann immer weiter zu den kleineren Zahlen.
Ich weiss zwar wie man sortiert, aber wie kann ich value und key beisammenhalten? Hatte erstmal an ein Array gedacht. Jedes Value gibt einen Arrayeintrag. Allerdings kann es auch vorkommen, das es gleiche Values gibt - was mir dann alles wieder zu nichte machen würde.

Wenns geht bitte ohne Modulen :frown:

Trap
2005-01-06, 02:39:55
Ich kenn Perl nicht. In Python würde ich ein Array an Tupeln (also Wertpaare (Zahlenwert, Name)) erzeugen und das sortieren. Guck mal ob es in Perl auch tuples gibt.

Kant
2005-01-06, 03:20:53
Jo wie mach ich das?
Wenn ich z.B. son Hash habe:
$Hash{Punkte1} = 345;
$Hash{Punkte2} = 123;
$Hash{Punkte3} = 548;

Ich will mittels einer foreachschleife alle Punkte auflisten.
Allerdings ist bei Hashes alls durcheinander. Wie kann ich aber die Reihenfolge so bestimmen, das z.B. die grösste Zahl (value) samt Hashkey als erstes aufgelistet wird und dann immer weiter zu den kleineren Zahlen.
Ich weiss zwar wie man sortiert, aber wie kann ich value und key beisammenhalten? Hatte erstmal an ein Array gedacht. Jedes Value gibt einen Arrayeintrag. Allerdings kann es auch vorkommen, das es gleiche Values gibt - was mir dann alles wieder zu nichte machen würde.

Wenns geht bitte ohne Modulen :frown:

Baus doch einfach temporär in ein Array um, beide Werte mit Trennzeichen:

$Hash{"Punkte1"} = 345;
$Hash{"Punkte2"} = 123;
$Hash{"Punkte3"} = 548;

# Werte mit Trennzeichen (###) in ein Array packen
undef @toSort;
foreach $id (keys %Hash) { push(@toSort,$Hash{$id}."###".$id);}

# Durch das (sortierte) Array durchgehen, Array dabei wieder am Trennzeichen aufbrechen
foreach $id (sort { $b <=> $a} @toSort) {
($Punkte,$Spieler)=split(/\#\#\#/,$id);
print $Punkte.":".$Spieler."\n";
}

M@tes
2005-01-06, 12:57:15
Ich hab schon des Rätzels Lösung :)
Hab es erstmal so versucht:
foreach (sort keys %Hash) {
Geht soweit, allerdings sortiert er das ganze dann nach den keys.
Wenn ich Value nehme, sortiert er value, allerdings weiss ich dann die keys zum aufrufen nciht^^

Hab es nun so hinbekommen:
foreach (sort { $Hash{$a} <=> $Hash{$b} } keys %Hash) {

Dennoch danke :-)