Markus**: nicht diese Element aus der Menge X

Hallo liebes Forum,

ich versuche im Moment, (mal wieder) eine Funktion zu schreiben, die mir gewissermaßen ein negiertes Ergebnis einer Menge liefert.

Beispiel: nicht 1,2,6 und 8 aus 0 bis 10.
sollte ja ergeben: 0,3,4,5,7,9,10

Mein bisheriger Ansatz (Perl):

  
my @a=(0..12);		#ursprungsmenge (0 bis 12)  
my $i=0;  
my @b=(2,4,6,9,11);	#mag ich nicht haben  
while ($#b >= 0) {  
	splice(@a,$b[0]-$i,1);  
	shift(@b);  
	$i++;}  
  
print @a;	#@a enthält ursprungsmene ohne @b  

Das Beispiel wird natürlich nur unter best. Voraussetzungen das gewünschte Ergebnis liefern. Z.B. muß das Array b nach Größe aufsteigend sortiert sein und im idealfall auch bestandteil der Menge a sein, etc.

Ich denke mal, die Problematik hat jeder schonmal gehabt, nur frage ich mich, ob es nicht vielleicht besser u.v.a. effizienter lösbar ist.
Hat jemand Vorschläge oder Ansätze, wie man dieses lösen kann?

Grüße, Markus**

  1. my @a=(0..12); #ursprungsmenge (0 bis 12)
    my $i=0;
    my @b=(2,4,6,9,11); #mag ich nicht haben
    while ($#b >= 0) {
    splice(@a,$b[0]-$i,1);
    shift(@b);
    $i++;}

    print @a; #@a enthält ursprungsmene ohne @b

      
    splice ist teuer.  
    Arbeite mit einem hash und einer Array kopie  
      
    ~~~perl
      
    my @in = (0 .. 100);  
    my @no = (42, 4711);  
    my %no = map{$_ => 1;} @no;  
    my @ret=();  
    foreach(@in){  
      exists $no{$_} or push @ret, $_;  
    }  
    
    

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
    1. Hi Beat,

      splice ist teuer.

      Genau, Splice ist teuer - daher auch die Frage. Bei 10 Elementen ist das wohl noch zu verkraften, aber... usw.

      Arbeite mit einem hash und einer Array kopie

      my @in = (0 .. 100);
      my @no = (42, 4711);
      my %no = map{$_ => 1;} @no;

      woher kommt das $\_ in der Zeile?  
      
      > ~~~perl
        
      
      > my @ret=();  
      > foreach(@in){  
      >   exists $no{$_} or push @ret, $_;  
      > }  
      > 
      
      

      Verstehe irgendwie grade nicht so genau, was dort von Statten geht.
      "exists" z.B. ist mir völlig neu. ich frag mal perldoc

      Und was, wenn man es nicht in Perl realisieren möchte? Hatte ja extra "Programmiertechnik" und nicht "Perl" als Thema ausgewählt!

      mfg Beat

      Vielen Dank

      1. Hallo Markus,

        Und was, wenn man es nicht in Perl realisieren möchte? Hatte ja extra "Programmiertechnik" und nicht "Perl" als Thema ausgewählt!

        nehmen wir an, die Werte befänden sich in der Spalte wert einer Tabelle liste, so bekäme ich das Wunschergebnis durch diese einfache SQL-Anweisung

        SELECT  
            wert  
        FROM  
            liste  
        WHERE  
            wert NOT IN (Liste verbotener Werte)  
        
        

        Was missfällt Dir an der Aschenputtelmethode?

        Für jeden Wert in der Ausgangsmenge
            Wenn der Wert nicht in der Menge der verbotenen Werte ist
                Füge den Wert der Zielmenge hinzu
            Ende Wenn
        Ende Für

        Freundliche Grüße

        Vinzenz

      2. my %no = map{$_ => 1;} @no;
        [/code]
        woher kommt das $_ in der Zeile?

        map iteriert über einen Array und $_ ist der Alias analog zu foreach

        Und was, wenn man es nicht in Perl realisieren möchte? Hatte ja extra "Programmiertechnik" und nicht "Perl" als Thema ausgewählt!

        Dann beschreibe dein Vorhaben so, dass es einen programmatischen Ablauf,
        nicht eine Implementation, beschreibt.

        Hier ist noch ein anderer schlechterer Ansatz

        my $no = join '|', @no;  
        my $ret = grep{ !/^($no)$/ } @in;
        

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        Der Valigator leibt diese Fische