nicht diese Element aus der Menge X
Markus**
- programmiertechnik
1 Beat0 Markus**0 Vinzenz Mai0 Beat
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**
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
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
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
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