Wie kann ich Arrays in Perl vergleichen?

7

Ich habe zwei Arrays, @a und @b . Ich möchte einen Vergleich zwischen den Elementen der beiden Arrays machen.

%Vor%

Wenn irgendein Element übereinstimmt, dann setze ein Flag. Gibt es einen einfachen Weg, dies zu tun?

    
devtech 07.04.2010, 10:51
quelle

10 Antworten

9

Zuerst müssen Ihre 2 Arrays korrekt geschrieben werden.

%Vor%

Zweitens können Sie für beliebige Arrays (zB Arrays, deren Elemente Verweise auf andere Datenstrukturen sein können) % verwenden. co_de% .

Bei Arrays, deren Elemente skalar sind, können Sie einen Vergleich mit Data::Compare List::MoreUtils durchführen, wobei BLOCK ist Ihre Vergleichsunterroutine. Sie können pairwise BLOCK ARRAY1 ARRAY2 emulieren (wenn Sie keinen Zugriff auf List :: MoreUtils haben) über:

%Vor%

P.S. Ich bin mir nicht sicher, aber List :: Compare kann die Listen immer sortieren. Ich bin nicht sicher, ob es paarweise Vergleiche machen kann.

    
DVK 07.04.2010, 11:14
quelle
7

Liste :: Vergleichen

%Vor%     
Quentin 07.04.2010 10:52
quelle
4

Aktivieren Sie diese Option, um eine Schnittpunktfunktion zu erstellen, die eine Liste von Elementen zurückgibt, die in beiden Listen vorhanden sind. Dann hängt Ihr Rückgabewert von der Anzahl der Elemente in der durchschnittenen Liste ab.

Sie können im Web einfach die beste Implementierung von intersect für Perl finden. Ich erinnere mich, dass ich vor ein paar Jahren danach gesucht habe.

Folgendes habe ich gefunden:

%Vor%     
David Brunelle 07.04.2010 12:18
quelle
2

Dies ist eine Möglichkeit:

%Vor%     
user181548 07.04.2010 11:27
quelle
1

Aus der Anforderung, dass "wenn beliebiges -Element übereinstimmt", verwenden Sie die Schnittmenge der Mengen:

%Vor%     
Phil H 07.04.2010 11:25
quelle
1
%Vor%

Beachten Sie, dass Sie Perl 5.10 oder höher benötigen, um den intelligenten Match-Operator zu verwenden ( ~~ ).

    
Mike 07.04.2010 11:21
quelle
0

Brute force sollte den Trick für kleine a n übernehmen:

%Vor%

Verwenden Sie für ein großes n eine Hashtabelle:

%Vor%

Wo ein großer n ist |@a| + |@b| > ~1000 Artikel

    
dsm 07.04.2010 11:50
quelle
0

Meiner Meinung nach sollten Sie List :: MoreUtils :: pairwise verwenden. Wenn Sie jedoch aus irgendeinem Grund nicht können, gibt das folgende Sub eine 1 für jeden Index zurück, wo der Wert in dem ersten Array gleich dem Wert in dem zweiten Array vergleicht. Sie können diese Methode beliebig verallgemeinern und Ihren eigenen Komparator übergeben, wenn Sie das möchten, aber zu diesem Zeitpunkt installieren Sie einfach Liste :: MoreUtils wäre eine produktivere Nutzung Ihrer Zeit.

%Vor%     
Sinan Ünür 07.04.2010 14:55
quelle
0

Das ist Perl. Die "offensichtliche" Lösung:

%Vor%

gegeben "\ 0" nicht in @a.

Aber danke, dass du bestätigt hast, dass es keine andere generische Lösung gibt, als deine eigene zu rollen.

    
Coroos 14.09.2017 08:12
quelle
0
%Vor%     
beasy 19.09.2017 17:44
quelle

Tags und Links