Thread Array mit Hashes sortieren und Elemente entfernen (10 answers)
Opened by bianca at 2015-09-08 19:49

Raubtier
 2015-09-09 09:39
#182111 #182111
User since
2012-05-04
1076 Artikel
BenutzerIn
[default_avatar]
2015-09-09T05:07:15 bianca
2015-09-08T18:32:47 Raubtier
Edit: und wenn du den Key doch gelöscht haben willst: warum soll das gleichzeitg mit dem Sortieren geschehen?

Ich nehme an, dass es effizienter ist, wenn Perl das Array nur einmal "beackern" muss. Aber vermutlich wird das erst ab richtig großen Mengen entscheidend.


Effizienzannahmen sind immer falsch, sofern man sie nicht getestet hat :-)

Ersthaft: das sort sortiert dir ein Array von Hash-Referenzen. Solange das Sortieren nicht abgeschlossen ist, kannst du den Sort-Key aber nicht aus dem Hash löschen. Wie soll es also möglich sein, gleichzeitig zu sortieren und den Key zu löschen? Man könnte höchstens den Sortieralgorithmus selbst neu implementieren und in diesem dann direkt den Key löschen, sobald das entsprechende Element seinen richtigen Platz in der Sortierung gefunden hat. Ich bezweifle aber, dass das helfen würde.

Um das Hinzufügen und Löschen des Hash-Keys zu sparen, könnte man alternativ ein Array nutzen, in welchem man die sortierten Positionen speichert.

In deinem Beispiel würde dann sein:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
use strict;
use warnings;
use Data::Dumper;

my @unsortiert = (
    {
        name    => 'alpha',
        test    => 'I',
    },
    {
        name    => 'beta',
        test    => 'II',
    },
    {
        name    => 'gamma',
        test    => 'III',
    },
);

# anstatt nun den Hashes aus @unsortiert die Sort-Keys zu berechnen
# und im jeweiligen Hash zu speichern, speicherst du die Sort-Keys in
# einem Array. 
my @sortValues = (2, 1, 3);

# Das Ursprungsarray bleibt unverändert, wir sortieren nur ein neues
# Array, das mir die Indizes sortiert.
my @sortIdx = sort { $sortValues[$a] <=> $sortValues[$b] }  (0..$#unsortiert);
for (@sortIdx) {
    print Dumper $unsortiert[$_]
}


Wenn das Hinzufügen und Löschen der sorter-Keys wirklich ein Problem darstellt, könnte obiges schneller sein. Außerdem sollte ein Array-Zugriff auch schneller sein als ein Hash-Zugriff. Aber ich will nichts garantieren, bitte austesten!
Last edited: 2015-09-09 09:42:14 +0200 (CEST)

View full thread Array mit Hashes sortieren und Elemente entfernen