mehrdimensionale arrays ordnen (schwartzsche transformation)
norman
- perl
guten morgen!
ich habe mich zwar ne ganze zeit mit der schwartzschen transformation auseinandergesetzt (entsprechende internetseiten studiert) und verloren, hab das ding leider nicht komplett durchschauen können.
problem: ich möchte den array nach der ersten und vierten spalte ordnen. das script funkt leider nicht richtig. was ist falsch?
my @list = ( [0, 3, 2, eins],
[1, 3, 1, drei],
[2, 9, 5, xxx],
);
my $sortedList =
map { $_->[1] # warum element 1 und nicht 0?
sort { $a->[0] <=> $b->[0]
||
$a->[3] cmp $b->[3]
}
map { [$_, @list ] } # ist auch unklar und die fehlerquelle
@list;
mfg
norman
problem: ich möchte den array nach der ersten und vierten spalte ordnen. das script funkt leider nicht richtig. was ist falsch?
Ich bin auch kein Fachmann der schwartzschen Transformation, aber so wie ich das sehe ist die bei dir niocht nötig. Lese mal:
http://www.wikiservice.at/dse/wiki.cgi?PerlIdioms#SchwartzscheTransformation
Dort steht:
"Problem: Ich sortiere eine Liste von "Dingen" nach einem bestimmten Kriterium, und zwar ist dieses Kriterium eine Funktion des "Dings", die einigermassen aufwendig ist. Beispielsweise das Sortieren von Dateinamen nach dem Alter der Datei."
Das wichtige ist "...eine Funktion des Dings, die einigermassen aufwendig ist", und das finde ich bei dir nicht.
Also kannst du einfach die Liste sortieren:
my @sorted = sort {$a->[0] <=> $b->[0] ||$a->[3] cmp $b->[3]} @list;
my $sortedList =
map { $_->[1] # warum element 1 und nicht 0?
weil du eine neue Liste mit anonymen Arrays erzeugst und je nachdem was da drinne steht willst du den einen oder anderen Eintrag aus diesem Array.
sort { $a->[0] <=> $b->[0]
||
$a->[3] cmp $b->[3]
}
Das kann nicht funktionieren, da du hier ja
map { [$_, @list ] } # ist auch unklar und die fehlerquelle
nur eine Liste die ungefähr so aussieht, erzeugst:
[ ARRAY(0), ARRAY(0), ARRAY(1), ARRAY(2) ]
[ ARRAY(1), ARRAY(0), ARRAY(1), ARRAY(2) ]
[ ARRAY(2), ARRAY(0), ARRAY(1), ARRAY(2) ]
Struppi.
von Kristian:
my @sorted_list = map { $_->[0] }
sort { $a->[1] <=> $b->[1] ||
$a->[2] cmp $b->[2] }
map { [ $_, $_->[0], $_->[3] ] } @list;
my @sorted_list = map { $_->[0] }
sort { $a->[1] <=> $b->[1] ||
$a->[2] cmp $b->[2] }
map { [ $_, $_->[0], $_->[3] ] } @list;
Diesmal richtig, aber, wie schon erwähnt, völlig überflüssig, da du ja keine komplizierten Berechnungen machst.
Struppi.