Frank Schönmann: Perl: Hash nach Werten sortieren

hi!

Ich möchte gerne einen Hash sortieren, aber nicht nach Keys, sondern nach den Werten. Ich habe eine kleine Suchmaschine programmiert, die die gefundenen Seiten bewertet. Die Bewertung wird in einem Hash gespeichert:
  $bewertung{"$dateiname"} = $wert;
Je nachdem, wie hoch die Bewertung ist, desto weiter oben soll der Eintrag in der Ausgabe stehen.

Für die Ausgabe wird der Hash in ein Array umgewandelt:
  @found = keys(%b);

Die Sortierroutine darf also irgendwo am Hash oder am Array ansetzen. Leider habe ich momentan keine, wie ich das lösen könnte. Vielleicht kann mir einer von euch helfen?

bye, Frank!

  1. hi!
    Für die Ausgabe wird der Hash in ein Array umgewandelt:
      @found = keys(%b);

    Die Sortierroutine darf also irgendwo am Hash oder am Array ansetzen. Leider habe ich momentan keine, wie ich das lösen könnte. Vielleicht kann mir einer von euch helfen?

    bye, Frank!

    Hallo Frank,

    für das Sortieren eines Arrays gibt es die sort-Funktion, die jedoch sortiert nur nach den Werten, die 'vorne dran' stehen. Soll beispielsweise eine Liste mit Datumswerten der Form 'tt.mm' sortiert werden, sortiert diese Funktion diese Liste akkurat nach 'tt'. In einer (for)Schleife kannst Du jedoch die einzelnen Listenelemente aufsplitten und innerhalb der Schleife wieder zusammensetzen als 'mm.tt', also dass das 'mm' vorne dran steht. Nach der Schleife die sort-Funktion anwenden -> Liste ist nun nach 'mm' sortiert.
    Nun wieder eine Schleife und die Tage wieder vorne dranschnippeln, die Sortierreihenfolge bleibt.
    So oder so könnte das auch mit Deiner Liste gemacht werden... vielleicht ist das eine mögliche L.
    Viele Grüße
    Rolf

    1. hi!

      Für die Ausgabe wird der Hash in ein Array umgewandelt:
        @found = keys(%b);

      Die Sortierroutine darf also irgendwo am Hash oder am Array ansetzen. Leider habe ich > > momentan keine Idee, wie ich das lösen könnte. Vielleicht kann mir einer von euch helfen?

      für das Sortieren eines Arrays gibt es die sort-Funktion, die jedoch sortiert nur nach den

      Leider funktioniert es so nicht :-( Ich erklär es nochmal ausführlicher:

      Ich hab einen Hash %bewertung, der als Index die gefundene URL verwendet, und die Bewertung speichert. Zum Beispiel: $bewertung{'/index.html'} = 5;
      Für die Ausgabe will ich aber die Suchergebnisse nach der Bewertung sortieren, sie stehen aber nach der Reihenfolge, wie sie gefunden wurden, im Hash, und damit auch im Array, in das ich den Hash umwandle.
      Ich möchte also erst die Reihenfolge im Hash nach der Bewertung umsortieren und es dann in ein Array umwandeln. Und dafür funktioniert die sort-Funktion leider nicht :-(

      bye, Frank!

      1. Hallo Frank,
        probier doch mal dieses Script (es mag zwar etwas umständlich erscheinen, aber es geht):

        ---------schnipp---------------

        hash Beispiel

        %bewertung=(
        "Otto.htm","4",
        "Karl.htm","5",
        "Cäsar.htm","3",
        "Meier.htm","2",
        "Rolf.htm","1"
        );
        $i=1;
        $a=1;
        for(%bewertung)
        {
        if($i%2 != 0)
        {
          $url[$i] = $_;
        }
        else
        {
        $note[$i] = $_;
        }
        if($i%2 ==0)
        {
        $liste[$a] = "$note[$i].er Platz: $url[$i-1]";
        $a++;
        }
        $i++;
        }

        Nach Platz sortieren

        @liste = sort(@liste);
        for(@liste)
        {
        print $_,"<br>";
        }
        ---------schnapp-------------
        ...Die Ausgabe sieht so aus:

        1.er Platz: Rolf.htm
        2.er Platz: Meier.htm
        3.er Platz: Cäsar.htm
        4.er Platz: Otto.htm
        5.er Platz: Karl.htm

        Viele Grüße, Rolf

      2. Hallo auch ...

        hi!

        Für die Ausgabe wird der Hash in ein Array umgewandelt:
          @found = keys(%b);

        Die Sortierroutine darf also irgendwo am Hash oder am Array ansetzen. Leider habe ich > > momentan keine Idee, wie ich das lösen könnte. Vielleicht kann mir einer von euch helfen?

        für das Sortieren eines Arrays gibt es die sort-Funktion, die jedoch sortiert nur nach den

        Leider funktioniert es so nicht :-( Ich erklär es nochmal ausführlicher:

        Ich hab einen Hash %bewertung, der als Index die gefundene URL verwendet, und die Bewertung speichert. Zum Beispiel: $bewertung{'/index.html'} = 5;
        Für die Ausgabe will ich aber die Suchergebnisse nach der Bewertung sortieren, sie stehen aber nach der Reihenfolge, wie sie gefunden wurden, im Hash, und damit auch im Array, in das ich den Hash umwandle.
        Ich möchte also erst die Reihenfolge im Hash nach der Bewertung umsortieren und es dann in ein Array umwandeln. Und dafür funktioniert die sort-Funktion leider nicht :-(

        bye, Frank!

        Die sort-Funktion kann hier sehr gut eingesetzt werden:
        Man hat die Möglichkeit, als Parameter auch eine Sortierfunktion mit anzugeben; Diese
        kann dann für die eigentliche Sortierung den Hash-Wert heranziehen. Die Sortierfunktion
        erhält keine eigentlichen Parameter. Stattdessen sind in den lokalen Variablen $a und $b
        die zu vergleichenden Werte angegeben. <=> ist die numerische Vergleichsoperation:

        @reihenfolge = sort {$bewertung($a) <=> $bewertung($b)} (keys(%bewertung));

        Sollte die Reihenfolge andersherum gewünscht sein, so müssen $a und $b einfach vertauscht werden. Für Textvergleiche ist cmp anstelle von <=> zu verwenden...

        Ich hoffe, daß Du hiermit das gewünschte erreichst

        Jörk

        1. hi!

          Ich möchte also erst die Reihenfolge im Hash nach der Bewertung umsortieren und
          es dann in ein Array umwandeln. Und dafür funktioniert die sort-Funktion leider nicht :-(

          Die sort-Funktion kann hier sehr gut eingesetzt werden:
          Man hat die Möglichkeit, als Parameter auch eine Sortierfunktion mit anzugeben; Diese
          kann dann für die eigentliche Sortierung den Hash-Wert heranziehen. Die Sortierfunktion
          erhält keine eigentlichen Parameter. Stattdessen sind in den lokalen Variablen $a und $b
          die zu vergleichenden Werte angegeben. <=> ist die numerische Vergleichsoperation:

          @reihenfolge = sort {$bewertung($a) <=> $bewertung($b)} (keys(%bewertung));

          Danke, genau so funktioniert es. Allerdings hatte ich mittlerweile die Antwort schon ;-)) Aber da hätte ich wirklich selbst draufkommen sollen, vor allem nachdem ich eine ähnliche Frage im Forum beantwortet habe...

          bye, Frank!