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);
2015-09-08T18:32:47 RaubtierWenn du Speicher sparen musst, würde ich das Array in place sortieren. Seit Perl 5.10 geht das (siehe http://perldoc.perl.org/perl5100delta.html#In-plac...)
2015-09-08T18:32:47 RaubtierMeinst du wirklich, dass es hilft, den überflüssigen sort-Key zu löschen?
2015-09-08T18:32:47 RaubtierEdit: und wenn du den Key doch gelöscht haben willst: warum soll das gleichzeitg mit dem Sortieren geschehen?
2015-09-08T18:32:47 RaubtierWas spricht dagegen, den Sort-Key nach dem Sortieren zu löschen? Also einfach ein delete $_->{sorter} for @arraz hinterdran.
2015-09-09T05:07:15 bianca2015-09-08T18:32:47 RaubtierEdit: 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.
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[$_] }
2015-09-09T07:39:47 RaubtierSolange das Sortieren nicht abgeschlossen ist, kannst du den Sort-Key aber nicht aus dem Hash löschen.
2015-09-09T16:35:46 GUIfreund2015-09-09T07:39:47 RaubtierSolange das Sortieren nicht abgeschlossen ist, kannst du den Sort-Key aber nicht aus dem Hash löschen.
Keine Sorge, das kann im vorliegenden Fall nicht passieren.
@x = sort { delete $a->{sorter} <=> delete $b->{sorter} } @x
2015-09-08T17:49:42 biancaIch 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
my @sortiert = map {delete $_->{sorter}} sort {$a->{sorter} <=> $b->{sorter}} @unsortiert;
1
2
@array = sort {$a->{sorter} <=> $b->{sorter}} @array;
@array = map {delete $_->{sorter}} @array;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
my @ar = ( { name => 'alpha', sorter => 2, test => 'I', }, { name => 'beta', sorter => 1, test => 'II', }, ); @ar = map{ $_->{name}, $_->{test} } sort{ $a->{sorter} <=> $b->{sorter} }@ar; # nimm nur das was brauchst print Dumper $_ for @ar;
@ar = map{ {name => $_->{name}, test => $_->{test}} } sort{ $a->{sorter} <=> $b->{sorter} }@ar;