/ / Prüfen Sie, ob ein Array einen Wert aus einem anderen Array enthält - Arrays, Perl, Nested-Loops

Überprüfen Sie, ob ein Array einen Wert aus einem anderen Array enthält - arrays, perl, nested-loops

Ich habe ein Array von Objekten und ein Array vonakzeptable Rückgabewerte für eine bestimmte Methode. Wie reduziere ich das Array von Objekten nur auf diejenigen, deren Methode einen Wert in meinem Array mit akzeptablen Werten zurückgibt?

Im Moment habe ich Folgendes:

my @allowed = grep {
my $object = $_;
my $returned = $object->method;
grep {
my $value = $_;
$value eq $returned;
} @acceptableValues;
} @objects;

Das Problem ist, dass dies eine zusammengesetzte Schleife ist, die ich gerne vermeiden möchte. Dieses Programm soll auf beliebige Größen skaliert werden, und ich möchte die Anzahl der durchgeführten Iterationen minimieren.

Was ist der beste Weg, dies zu tun?

Antworten:

7 für die Antwort № 1

Sie können die akzeptierten Rückgabewerte in einen Hash umwandeln

my %values = map { $_ => 1 } @acceptedValues;

Und grep mit der Bedingung, dass der Schlüssel statt Ihres existiert original grep:

my @allowed = grep $values{ $_->method }, @objects;

Sowieso, grep ist an sich ziemlich schnell und das ist nur eineVorstellung von a allgemeiner Ansatz zur Überprüfung, ob sich ein Element in einem Array befindet. Versuche nicht zu optimieren, was "nicht benötigt wird, da es nur in wirklich großem Wert wäre Arrays Dann könnten Sie beispielsweise das akzeptierte Ergebnisfeld sortieren und Verwenden Sie eine binäre Suche oder zwischenspeichern Sie die Ergebnisse, wenn sie wiederholt werden. Aber wieder nicht Sorgen Sie sich mit dieser Art der Optimierung, wenn Sie nicht mit Hunderten zu tun haben von Tausenden von Artikeln - oder mehr.


1 für die Antwort № 2

Elemente, die in bestimmten Arrays vorhanden sein sollenscheint einzigartig zu sein. Also mache ich einen Hash, der die Anzahl der Elemente aus beiden Arrays enthält. Wenn ein Element mit einer Anzahl größer als 1 vorhanden ist, bedeutet dies, dass es in beiden Arrays vorhanden ist.

my %values;
my @allowed;
map {$values{$_}++} (@acceptableValues, @objects);
for (keys %values) {
push @allowed, $_ if $values{$_} > 1;
}