Quitschibo: Wie Sortiert man ein Array nach einem bestimmten darin befindlichen Wert?

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

  1. 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++)
    {

    splitte die Werte (damit du die Nummern hast)

    (undef,undef,$nr1) = split(/,/,$feld[$i]);

    gehe nochmal jedes Feld durch

    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]);
       }
      }
    }

    ausgeben

    foreach (@feld)
    {
    print $_."\n";
    }

    vertauschen

    sub swap($$)
    {
    $val1 = shift;
    $val2 = shift;

    return ($val2,$val1);
    }

    mfg
    CK1

    1. 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 ;-)