Wie Sortiert man ein Array nach einem bestimmten darin befindlichen Wert?
Quitschibo
- perl
Hi Zusammen...
also... mein Problem ist folgendes:
Ich habe ein Array das pro Zeile jeweils drei Werte hat... sieht wie folgt aus:
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
...etc...
nun sollen diese Zeilen nach einem bestimmten Wert sortiert werden. In diesem Fall nach dem Zahlenwert. Also
unsortiert:
Wert1,Wert2,125
Wert1,Wert2,123
wert1,Wert3,124
sortiert:
Wert1,Wert2,123
Wert1,Wert2,124
wert1,Wert3,125
... ich habs über die einfache sort funktion versucht.. aber das würde uns hier nicht weiter bringen.. kann mir also jemand sagen wie das geht?
CU Quitschi
Hi,
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
Wert1,Wert2,Zahlenwert
[...]
Wert1,Wert2,125
Wert1,Wert2,123
wert1,Wert3,124
[...]
Wert1,Wert2,123
Wert1,Wert2,124
wert1,Wert3,125
[...]
Meinetwegen, das Feld sieht so aus:
@feld = ('bla1,bla,1','bla2,bla,4','bla3,bla,3','bla4,bla,2');
Dann gehe jedes Feld durch:
for($i=0;$i<=$#feld;$i++)
{
(undef,undef,$nr1) = split(/,/,$feld[$i]);
for($j=0;$j<=$#feld;$j++)
{
(undef,undef,$nr2) = split(/,/,$feld[$j]);
# und überprüfe, ob es ein Feld mit einem kleineren Wert gibt
if($nr1 < $nr2)
{
# wenn ja, dann vertausche die beiden Felder
($feld[$i],$feld[$j]) = swap($feld[$i],$feld[$j]);
}
}
}
foreach (@feld)
{
print $_."\n";
}
sub swap($$)
{
$val1 = shift;
$val2 = shift;
return ($val2,$val1);
}
mfg
CK1
Hi,
@feld = ('bla1,bla,1','bla2,bla,4','bla3,bla,3','bla4,bla,2');
Dann gehe jedes Feld durch:
oder mach's einfacher (ungetestet):
my @sorted_feld = sort { (split(/,/,$a))[2] <=> (split(/,/,$b))[2] } @feld;
Man beachte, daß die Zahl der split()s exponentiell mit der Zahl der Elemente in @feld steigt... eventuell ist es besser, vorher einmal mit
for (my $i=0; $i<scalar @feld, $i++) {
my ($x, $y, $z) = split(/,/, $feld[$i]);
$feld[$i] = "$z,$x,$y";
}
ganz @feld zu bearbeiten, dann einfach nur noch simpel my @sorted_feld = sort @feld; dranzusetzen und das Array anschließend analog wieder zurückzuwandeln.
Cheatah
P.S.: Den zweiten Code kann man sicher mit map noch optimieren, da bin ich aber zu faul zu ;-)