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

clms
 2015-09-08 20:44
#182105 #182105
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
2015-09-08T17:49:42 bianca
Ich würde gern ein Array of Hashes nach einem bestimmten Key sortieren und diesen Key dabei gleich löschen, da er nur hilfsweise für die Sortierung dient.

Da das Array eventuell etwas größer werden könnte möchte ich das so ressourcenschonend wie möglich machen.
Im Moment sieht das so aus:
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
#!/usr/bin/perl
use strict;
use warnings;

my @unsortiert = (
    {
        name    => 'alpha',
        sorter  => 2,
        test    => 'I',
    },
    {
        name    => 'beta',
        sorter  => 1,
        test    => 'II',
    },
);

my @sortiert;
foreach my $tmp (sort {$a->{sorter} <=> $b->{sorter}} @unsortiert) {
    delete $tmp->{sorter};
    push @sortiert,{%$tmp};
}

use Data::Dumper;
print Dumper(\@sortiert);

Daran gefällt mir insbesondere nicht, dass ich zwei Arrays im Speicher habe.
Ich würde es gern bei einem belassen aber wie kann ich dieses sortieren und gleichzeitig den Hilfs-Key "sorter" löschen?
Danke

Wenn ich es richtig sehe, hast Du sogar drei Arrays gleichzeitig im Speicher:
@unsortiert, das Ergebnis der Sort-Operation und @sortiert.
Allerdings ist das wahrscheinlich nicht mal halb so schlimm wie Du denkst, weil die Arrays nur Referenzen auf die Hashes speichern. Die Hashes selbst sind jeweils nur einmal gespeichert.

Falsch: die Hashes sind zweimal im Speicher, weil Du sie mit {%$tmp} kopierst. Wenn es Dir auf Speicherplatz ankommt, ändere die Zeile als erstes auf push @sortiert, $tmp;.

Ansonsten kannst Du Benchmarks fahren, ob eine der folgenden Pipe-Lösungen effizienter ist:
Code: (dl )
my @sortiert = map {delete $_->{sorter}} sort {$a->{sorter} <=> $b->{sorter}} @unsortiert;

oder - das Array ist hier nur zwei mal im Speicher -
Code: (dl )
1
2
@array = sort {$a->{sorter} <=> $b->{sorter}} @array;
@array = map {delete $_->{sorter}} @array;

Last edited: 2015-09-08 20:47:42 +0200 (CEST)

View full thread Array mit Hashes sortieren und Elemente entfernen