Daniel: Hash - Sortieren...

Hi!

Wie kann ich einen Hash, der so aufgebaut ist:

$ds{$idvonPeter}{name} = "Peter"
$ds{$idvonAlf}{name} = "Alf"

so in einer foreach Schleife sortieren, dass zuerst der Alt, und dann der Peter kommt?

Ich hoffe das ist verständlich erklärt und das mir kann jemand helfen.

Danke!
Daniel

  1. morgäääähn...

    das gute ins köpfchen, das schlechte ins kröpfchen :)

    *scnr*

    Gruß,
    water|

  2. gudn tach!

    Wie kann ich einen Hash [...] sortieren [...]?

    schon mal http://www.google.de/search?q=hash sort perl probiert?

    oder wo genau ist das problem?

    prost
    seth

  3. Hi!

    Wie kann ich einen Hash, der so aufgebaut ist:

    $ds{$idvonPeter}{name} = "Peter"
    $ds{$idvonAlf}{name} = "Alf"

    foreach ?

    try this:

    use strict;
    my %ds;
    my $idvonPeter = '1';
    my $idvonAlf = '2';

    $ds{$idvonPeter}{name} = 'Peter';
    $ds{$idvonAlf}{name} = 'Alf';

    my @names = map{$ds{$_}{name}} map{$_}keys %ds;
    @names = sort @names;

    print join("\n", @names), "\n";

    Gruss, Rolf

    1. Ähhm....

      my @names = sort map{$ds{$_}{name}} map{$_}keys %ds;

      ;-)

      schoenes WE, Rolf

      1. 你好 Rolf,

        my @names = sort map{$ds{$_}{name}} map{$_}keys %ds;

        Ich hoffe, das meinst du nicht ernst. Einen so schlechten Programmierstil
        hab ich schon lange nicht mehr gesehen...

        再见,
         CK

        --
        Zu wissen, was wir nicht wissen, ist die Quelle der Weisheit.
        http://wwwtech.de/
        1. hi Christian,

          my @names = sort map{$ds{$_}{name}} map{$_}keys %ds;

          Ich hoffe, das meinst du nicht ernst. Einen so schlechten Programmierstil
          hab ich schon lange nicht mehr gesehen...

          Es ist tatsächlich schlecht, weil:

          die Wahl der keys im hash ist Blödsinn, weil:

          der key 'name' keinen Sinn macht, weil:

          er mehrfach verwendet wird!

          Und zwar vorsätzlich ;-)

          Schönes WE, Rolf

          1. 你好 Rolf,

            hi Christian,

            my @names = sort map{$ds{$_}{name}} map{$_}keys %ds;

            Ich hoffe, das meinst du nicht ernst. Einen so schlechten
            Programmierstil hab ich schon lange nicht mehr gesehen...

            Es ist tatsächlich schlecht, weil:

            ... du zweimal voellig unnoetigerweise einen neuen Array erstellst, was
            viel Performance und Speicher kostet. Deine Methode hat den Aufwand
            O(2n) + O(ld n). Zusaetzlich natuerlich der Speicheraufwand.

            再见,
             CK

            --
            So, wie ein Teil ist, ist das Ganze.
            http://wwwtech.de/
            1. hi Christian,

              my @names = sort map{$ds{$_}{name}} map{$_}keys %ds;

              Ich hoffe, das meinst du nicht ernst. Einen so schlechten
              Programmierstil hab ich schon lange nicht mehr gesehen...

              Es ist tatsächlich schlecht, weil:

              ... du zweimal voellig unnoetigerweise einen neuen Array erstellst, was
              viel Performance und Speicher kostet. Deine Methode hat den Aufwand
              O(2n) + O(ld n). Zusaetzlich natuerlich der Speicheraufwand.

              Stimmt! Den Key 'name' brauchen wir ja gar nicht:

              my @names = sort map{$ds{$_}{name}}keys %ds;

              Gruss, Rolf

              1. 你好 Rolf,

                Stimmt! Den Key 'name' brauchen wir ja gar nicht:

                my @names = sort map{$ds{$_}{name}}keys %ds;

                O(n + ld n)

                my @names = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;

                Das ist dann O(ld n)

                再见,
                 CK

                --
                Der Verstand ist der Hausherr, der Koerper sein Gast.
                http://wwwtech.de/
                1. hi Chris,

                  Stimmt! Den Key 'name' brauchen wir ja gar nicht:

                  my @names = sort map{$ds{$_}{name}}keys %ds;

                  O(n + ld n)

                  my @names = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;

                  Das ist dann O(ld n)

                  Ja, wenn Du nur nach keys sortierst ;-)

                  Weischd !? Du sortierst nach key ! Nicht nach Value!

                  --Rolf

                  1. 你好 Rolf,

                    my @names = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;

                    Das ist dann O(ld n)

                    Ja, wenn Du nur nach keys sortierst ;-)

                    Nein. Guck dir doch bitte den Code nochmal genau an, vor allem den Code
                    zwischen den beiden {} von sort(). Ich sortiere nach dem name-Wert.

                    再见,
                     CK

                    --
                    Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
                    http://wwwtech.de/
                    1. hmm,

                      Nein. Guck dir doch bitte den Code nochmal genau an, vor allem den Code
                      zwischen den beiden {} von sort(). Ich sortiere nach dem name-Wert.

                      Stimmt, hast Recht, Sorry ;-)

                      --Rolf

                2. hi Christian,

                  da ist mir noch was unklar,

                  Stimmt! Den Key 'name' brauchen wir ja gar nicht:

                  my @names = sort map{$ds{$_}{name}}keys %ds;

                  O(n + ld n)

                  my @names = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;

                  Das ist dann O(ld n)

                  hmm, wenn ich

                  my @names = sort map{$ds{$_}{name} ; print "#"; }keys %ds;

                  ausgebe, sehe ich genauso viele '#' wie es Listenelemente gibt. Wie kommst Du dann auf O(n + ld n) ?

                  Viele Grüße, Rolf

                  1. 你好 Rolf,

                    my @names = sort map{$ds{$_}{name}}keys %ds;
                    O(n + ld n)
                    my @names = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;
                    Das ist dann O(ld n)

                    hmm, wenn ich

                    my @names = sort map{$ds{$_}{name} ; print "#"; }keys %ds;

                    ausgebe, sehe ich genauso viele '#' wie es Listenelemente gibt. Wie
                    kommst Du dann auf O(n + ld n) ?

                    map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n). Daraus
                    folgt: O(n + ld n).

                    再见,
                     CK

                    --
                    No Shoes On Mat!
                    http://wwwtech.de/
                    1. hi Christian,

                      vielen Dank!

                      map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n). Daraus
                      folgt: O(n + ld n).

                      Hast Du mal ne Quelle wo ich das nachlesen kann?

                      Viele Grüße, Rolf

                      1. 你好 Rolf,

                        vielen Dank!

                        np.

                        map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n). Daraus
                        folgt: O(n + ld n).

                        Hast Du mal ne Quelle wo ich das nachlesen kann?

                        Nicht so richtig, ich hab dazu 'ne Vorlesung gehoert. Guck doch mal im
                        Internet nach Vorlesungs-Scripten zum Thema "Komplexitaet von Algorithmen".
                        Die Stichworte "Algorithmus Komplexitaet Aufwandsanalyse" sollten dir genug
                        Stoff liefern.

                        再见,
                         CK

                        --
                        Willst du die Freuden dieser Welt geniessen, so musst du auch ihr Leid erdulden.
                        http://wwwtech.de/
                        1. Hallo Christian,

                          vielen Dank!

                          map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n). Daraus
                          folgt: O(n + ld n).

                          Hast Du mal ne Quelle wo ich das nachlesen kann?

                          Nicht so richtig, ich hab dazu 'ne Vorlesung gehoert.

                          Du Glückspilz ;-)

                          Guck doch mal im
                          Internet nach Vorlesungs-Scripten zum Thema "Komplexitaet von Algorithmen".
                          Die Stichworte "Algorithmus Komplexitaet Aufwandsanalyse" sollten dir genug
                          Stoff liefern.

                          Klar, mach ich. Sowas interessiert mich immer.

                          Viele Grüße, Rolf

                          --
                          1. Hallo Rolf,

                            Hast Du mal ne Quelle wo ich das nachlesen kann?

                            Lass Dir in Deiner Lieblingsbuchhandlung

                            Algorithmen, Robert Sedgewick
                              (gibt es in diversen Sprachvarianten, meiner ist für Pascal)

                            mal zur Ansicht geben. Lies zur Probe das Kapitel "Analyse von Algorithmen", in meiner Ausgabe Kapitel 6.

                            Freundliche Grüsse,

                            Vinzenz

                    2. Hallo Christian,

                      map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n).

                      Nicht eher O(n ld n)?

                      Daraus folgt: O(n + ld n).

                      O(n + ld n) == O(n) oder nicht?

                      Grüße

                      Daniel

                      1. 你好 Daniel,

                        map {} kostet O(n), der Sortiervorgang kostet im Mittel O(ld n).
                        Nicht eher O(n ld n)?

                        Aeh, ja, du hast recht -- der Sortiervorgang kostet O(n * ld n). Das verpeil
                        ich jedesmal ;-) Deshalb: O(n) + O(n ld n).

                        Daraus folgt: O(n + ld n).
                        O(n + ld n) == O(n) oder nicht?

                        Nein, warum?

                        再见,
                         CK

                        --
                        Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
                        http://wwwtech.de/
                        1. Hi Christian

                          Daraus folgt: O(n + ld n).
                          O(n + ld n) == O(n) oder nicht?

                          Nein, warum?

                          Doch, weil nur die höchste Ordnung in die O-Notation einfliesst, alles niedrigere wird ignoriert.

                          Gruss Daniela

  4. 你好 Daniel,

    $ds{$idvonPeter}{name} = "Peter"
    $ds{$idvonAlf}{name} = "Alf"

    so in einer foreach Schleife sortieren, dass zuerst der Alt, und dann
    der Peter kommt?

    Vermutlich am einfachsten und performantesten mit sort():

    my @keys = sort { $ds{$a}{name} cmp $ds{$b}{name} } keys %ds;

    再见,
     CK

    --
    Beware Evildoers for my deed is done and every little damsel in distress will be shelted!
    http://wwwtech.de/